python实现奇数阶幻方

幻方所谓幻方,也教纵横图,就是在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()








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值