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)
任意阶幻方
最新推荐文章于 2021-11-12 14:55:52 发布