所谓幻方,也教纵横图,就是在n×n的方阵中放入1到n2个自然数:在一定的布局下,其各行、各列和两条对角线上的数字之和正好都相等。这个和数就叫做“幻方常数”或幻和。
构造幻方的方法:
奇数阶幻方,也就是3阶、5阶、7阶……幻方,那么如何构造这样的幻方呢?
我们可以采取罗伯法(也叫连续摆数法),其法则如下:
把“1”放在中间一列最上边的方格中,从它开始,按对角线方向(比如说按从左下到右上的方向)顺次把由小到大的各数放入各方格中,如果碰到顶,则折向底,如果到达右侧,则转向左侧,如果进行中轮到的方格中已有数或到达右上角,则退至前一格的下方。
按照这一法则建立5阶幻方的示例如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424195521127.jpg#pic_center)
罗伯法(连续摆数法)的助记口诀:
1 居上行正中央,依次斜填切莫忘。
上出框界往下写,右出框时左边放。
重复便在下格填,角上出格一个样。
1 居上行正中央——数字 1 放在首行最中间的格子中
依次斜填切莫忘——向右上角斜行,依次填入数字
上出框界往下写——如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中
右出框时左边放——同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中
重复便在下格填——如果数字{N} 右上的格子已被其它数字占领,就将{N+1} 填写在{N}下面的格子中
角上出格一个样——如果朝右上角出界,和“重复”的情况做同样处理。
a=[]
for i in range(5):
a.append([])
for j in range(5):
a[i].append(0)
j=0
k=2
b=1
a[j][k]=b
for i in range(24):
b=b+1
if(j<0):
j=5+j
if(k+1<5):
j=j-1
k=k+1
if(a[j][k]==0):
a[j][k]=b
else:
j=j+2
k=k-1
a[j][k]=b
else:
k=k-4
j=j-1
if(a[j][k]==0):
a[j][k]=b
else:
j=j+2
k=k-1
a[j][k]=b
for m in range(5):
for n in range(5):
print('{:<3}'.format(a[m][n]),end=" ")
print()