任意阶幻方

x1=input("please inout a number:")
x=int(x1)
a = [([0] * x)for i in range(x)]
b=[0]*(2*x-4)
c=[0]*(2*x-4)
def cs(x ,y):
    y=x**2+1-y
    return y
def odd(x):##奇数
    i=0;j=int(x/2)
    a[i][j]=1
    for k in range(2,x*x+1):
        i=i-1;j=j-1
        if(i<0):i=x-1
        if(j<0):j=x-1
        if(a[i][j]!=0):
            i=i+2
            j=j+1
            if(i>x-1):i=1
            if(j>x-1):j=0
        a[i][j]=k

def spectial_even(x):##双偶(4k)

    k=1
    for i in range(0,x):
        for j in range(0,x):
            a[i][j]=k
            k=k+1


    for i in range(0,x):##把对角线上的数全部中心对称反转
        if((i+1)%4==0):
           h=i
           for j in range(0,i+1):
               a[h][j]=cs(x,a[h][j])
               a[x-j-1][x-h-1]=cs(x,a[x-j-1][x-h-1])
               h=h-1


           k=i-3
           for j in range(0,x-k):
               a[k][j]=cs(x,a[k][j])
               a[j][k]=cs(x,a[j][k]) 
               k=k+1


    j=0
    for i in range(0,x):
        a[i][j]=cs(x,a[i][j])
        a[x-i-1][j]=cs(x,a[x-i-1][j])
        j=j+1


def even(x):##单偶(4k+2)

##*************************失败的尝试*****************************
##思路是想先用双偶做法做出中心 其他数字报对填入外层
##想用循环嵌套 枚举暴力填数  想了很久放弃了这种做法
##可能自己对枚举不够娴熟  而且这样做出来高阶可能会用很长的时间
##    k=2*x-1
##    for i in range(1,x-1):
##        for j in range(1,x-1):
##            a[i][j]=k
##            k=k+1
##
##
##    for i in range(1,x-1):##把对角线上的数全部中心对称反转
##        if((i+1)%4==1):
##           h=i
##           for j in range(1,i+1):
##               a[h][j]=cs(x,a[h][j])
##               a[x-j-1][x-h-1]=cs(x,a[x-j-1][x-h-1])
##               h=h-1
##
##
##           k=i-3
##           for j in range(1,x-k):
##               a[k][j]=cs(x,a[k][j])
##               a[j][k]=cs(x,a[j][k]) 
##               k=k+1
##
##    j=1 
##    for i in range(1,x-1):
##        a[i][j]=cs(x,a[i][j])
##        a[x-i-1][j]=cs(x,a[x-i-1][j])
##        j=j+1
##
##
##    a[0][0]=1;a[0][x-1]=2;a[x-1][0]=x**2-1;a[x-1][x-1]=x**2
##    
##    for i in range(0,2*x-4):
##        b[i]=i+3;
##    print(b);
##
##    for i in range(x**2-2*x+3,x**2-1):
##        c[i-x**2+2*x-3]=i;
##    print(c);
##***************************************************************
    h=int((x-2)/4)
    b=int(x/2)

    ##A
    i=0;j=int(b/2)
    for k in range(1,b**2+1):
        if(a[i][j]==0):
            a[i][j]=k
            i=i-1;j=j+1
            if(i<0):i=b-1
            if(j>b-1):j=0
        else:
            i=i+2;j=j-1
            if(i>b-1):i=1
            if(j<0):j=b-1
            a[i][j]=k
            i=i-1;j=j+1
            if(i<0):i=b-1
            if(j>b-1):j=0
    ##B
    i=b;j=b+int(b/2)
    for k in range(b**2+1,2*(b**2)+1):
        if(a[i][j]==0):
            a[i][j]=k
            i=i-1;j=j+1
            if(i<b):i=x-1
            if(j>x-1):j=b
        else:
            i=i+2;j=j-1
            if(i>x-1):i=b+1
            if(j<b):j=x-1
            a[i][j]=k
            i=i-1;j=j+1
            if(i<b):i=x-1
            if(j>x-1):j=b
    ##C
    i=0;j=b+int(b/2)
    for k in range(2*(b**2)+1,3*(b**2)+1):
        if(a[i][j]==0):
            a[i][j]=k
            i=i-1;j=j+1
            if(i<0):i=b-1
            if(j>x-1):j=b
        else:
            i=i+2;j=j-1
            if(i>b-1):i=1
            if(j<b):j=x-1
            a[i][j]=k
            i=i-1;j=j+1
            if(i<0):i=b-1
            if(j>x-1):j=b
    ##D
    i=b;j=int(b/2)
    for k in range(3*(b**2)+1,4*(b**2)+1):
        if(a[i][j]==0):
            a[i][j]=k
            i=i-1;j=j+1
            if(i<b):i=x-1
            if(j>b-1):j=0
        else:
            i=i+2;j=j-1
            if(i>x-1):i=b+1
            if(j<0):j=b-1
            a[i][j]=k
            i=i-1;j=j+1
            if(i<b):i=x-1
            if(j>b-1):j=0


    ##调换
    for j in range(0,h):
        for i in range(0,b):
            a[i][j]=a[i][j]+a[b+i][j]
            a[b+i][j]=a[i][j]-a[b+i][j]
            a[i][j]=a[i][j]-a[b+i][j]
    i=int(b/2)
    for j in range(0,2*h):
        a[i][j]=a[i][j]+a[b+i][j]
        a[b+i][j]=a[i][j]-a[b+i][j]
        a[i][j]=a[i][j]-a[b+i][j]
    j=x-i+1
    for k in range(0,h-1):
            for i  in range(0,b):
                a[i][j]=a[i][j]+a[b+i][j]
                a[b+i][j]=a[i][j]-a[b+i][j]
                a[i][j]=a[i][j]-a[b+i][j]
            j=j-1










if(x%2==1):odd(x)
if(x%4==0):spectial_even(x)
if(x%2==0)and(x%4!=0):even(x)
for i in range(0,x):
        for j in range(0,x):
            print("%4d"%a[i][j] ,end='  ')
        print("\n\n\n")
print("****************以下为幻方的验证*******************\n")
for i in range(0,x):
    sum=0
    for j in range(0,x):
       sum+=a[i][j]
    print("The sum of column %d is:%d"%(i+1,sum))

for j in range(0,x):
    sum=0
    for i in range(0,x):
       sum+=a[i][j]
    print("The sum of row %d is:%d"%(j+1,sum))
j=0;sum=0;
for i in range(0,x):
    sum+=a[i][j]
    j=j+1
print("左上右下对角线和为:",sum)

j=i;sum=0;
for i in range(0,x):
    sum+=a[i][j]
    j=j-1
print("左下右上对角线和为:",sum)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值