奇数阶幻方
类型:列表元组
描述
在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻方”。中国古代称为“河图”、“洛书”。
洛书蕴含奇门遁甲的布阵之道,九宫之数源于《易经》。幻方也称九宫图、纵横图、魔方、魔阵,它是科学的结晶与吉祥的象征。
古人总结的三阶幻方口诀为:
二四为肩,
六八为足,
载九履一,
左三右七,
五居中央
幻方不限于3阶,当N为奇数时,可用以下的方法来填数。
(1)将1填入第一行的中间;
(2)将每一个数字依次放在前一个数的右上方一格(行号减1列号加1)。
(i) 出现越界。如果这个数所要放的格已经超出了第一行,那么就把他放在最后一行,仍然放在右一列(列号加1,参考数字“2”)。如果这个数所要放的格已经超过最右列,那么就把他放在最左列的上面一行(行号减1,参考数字“57”)。
(ii)没越界,如果这个数所要放的格已经有数了,此时将其填在这个数的正下方一格(行号加1列号不变,参考数字“10”)。
(3)矩阵的最右上方的格子(第一行最后一列)中数的下一个数填在这个数的正下方一格(参考数字“46”)。
参考9阶幻方的结果,理解幻方填数方法,编程输出奇数阶幻方。
输入格式
输入一个大于0的奇数N
输出格式
N阶幻方
示例
输入:
3
输出:
8 1 6
3 5 7
4 9 2
参考代码
def magic_square(n):
# 构造二维列表
lst = [[0 for i in range(n)] for i in range(n)]
# 初始化列表位置
x, y = 0, n // 2
for num in range(1, n * n + 1):
lst[x][y] = num
xa, ya = x - 1, y + 1
# 回绕情况
if xa < 0:
xa = n - 1
if ya > n - 1:
ya = 0
# 占位情况
if lst[xa][ya] != 0:
x = x + 1
if x > n - 1:
x = 0
else:
x, y = xa, ya
return lst
m = int(input())
ls = magic_square(m)
for row in ls:
print(*row)