先看下图是一个神奇的魔方阵

这个魔方的神奇之处在于,横向,纵向,斜对角5个数字之和都是65。
你可以验证:
第一行元素之和:17+24+1+8+15=65
第一列元素之和:17+23+4+10+11=65
主对角线上元素之和:17+5+13+21+9=65
现在我们是已知结果,如果没有这个结果,如何找出这些数字并实现这个排列。
下面直接上代码:
########################
def array(n):
if n % 2 == 0: # n是偶数,则加1使其变为奇数
n = n + 1
max = n * n
mtrx = [1] * max
mtrx[n // 2] = 1 # 将1存入数组
i = 0 # 自然数1所在行
j = n // 2 # 自然数1所在列
for num in range(2, max + 1):# 从2开始确定每个数的存放位置
i = i - 1
j = j + 1
if (num - 1) % n == 0:# 当前数是n的倍数
i = i + 2
j = j - 1
if i < 0: # 当前数在第0行
i = n - 1
if j > n - 1: # 当前数在最后一列,即n-1列
j = 0
no = i * n + j # 找到当前数在数组中存放的位置
mtrx[no] = num
print("生成的%d-魔方阵为:" %n, end="")# 打印生成的魔方阵
no = 0
for i in range(0, n):
print()
for j in range(0, n):
print("%3d" %mtrx[no], end=" ")
no += 1
print()
if __name__ == "__main__":
n = int(input("请输入n值:"))
array(n) # 调用array()函数
########################
执行结果如下:
请输入n值:5
生成的5-魔方阵为:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
请输入n值:3
生成的3-魔方阵为:
8 1 6
3 5 7
4 9 2
________________END______________
网友评论