打印魔方阵(python)实现
程序员文章站
2022-03-27 13:58:57
'''魔方阵是我国古代发明的一种数字游戏: n阶魔方是指这样一种方阵,他的每一行,每一列以及对角线上的各数之和为同一个相同的常数,这个常数是:n*(n**2 + 1)/2,此常数称为魔方阵常数。由于偶数次阶的方阵求解起来比较困难,这里只考虑n为奇数的情况 以下就是一个n=3的魔方阵: 6 1 8 7 5 3 2 9 4 它的各行各列及对角线元素之和为15算法设计: 采用穷举法时,对于n比较到时,计算机也需要很长时间才能找出来。...
'''
魔方阵是我国古代发明的一种数字游戏:
n阶魔方是指这样一种方阵,他的每一行,每一列以及对角线上的各数之和为同一个相同的常数,这个常数是:n*(n**2 + 1)/2,此常数称为魔方阵常数。由于偶数次阶的方阵求解起来比较困难,这里只考虑n为奇数的情况
以下就是一个n=3的魔方阵:
6 1 8
7 5 3
2 9 4
它的各行各列及对角线元素之和为15
算法设计:
采用穷举法时,对于n比较到时,计算机也需要很长时间才能找出来。
将1,2,...,n^2按照某种规则一次填入到方阵中,得到的恰好是奇数次魔方阵,规则如下:
1、将1填入第一行的中间,即(1,(n+1)//2)的位置
2、下一个数填在上一个数的主对角线的上方,若上一个数的位置是(i,j),下一个数应该填在(i1,j1),i1=i-1,j1=j-1
3、若填写的位置下标出界,则出界的值用n来代替,即若i=1=0,则取i1=n,若j-1=0,则取j1=n。
4、若应填的位置虽然没有出界,但是已经填有数据的话,则应填在上一个数字的下面(行减1,列不变),即i1=i-1,j1=j。
5、这样循环填数,直到把n*n个数全部填入方阵中,最后得到的是一个n阶魔方阵。
'''
def main():
a = []
for i in range(1, 101): # 构造一个二维数组
b = []
for j in range(1, 101):
b.append(0)
a.append(b)
n = int(input("请输入n的值:"))
while True:
if n % 2 == 0:
print("您的输入有误,n应为奇数。")
n = int(input("请重新输入n的值:"))
else:
break
i = 1
j = int((n+1)/2)
x = 1
while x <= n**2:
a[i][j] = x
x +=1
i1 = i
j1 = j
i -= 1
j -= 1
if i == 0:
i = n
if j == 0:
j = n
if a[i][j] != 0:
i = i1 + 1
j = j1
# 矩阵格式化输出,因为数组上限位100,所以不考虑超过100阶的矩阵
for i in range(1, n + 1):
print('')
for j in range(1, n + 1):
if n > 0 and n < 10: # 格式化输出,以满足效果
print("%02d" % a[i][j], end=" ")
if n >= 10 and n < 32: # 格式化输出,以满足效果
print("%03d" % a[i][j], end=" ")
if n >= 32 and n < 100: # 格式化输出,以满足效果
print("%04d" % a[i][j], end=" ")
print(" ")
k_value =0
for i in range(1,n+1):
k_value += a[1][i]
print("%d次魔方阵常数:%d" %(n,k_value))
'''算法时间复杂度:O(n^2)'''
if __name__ == '__main__':
main()
输出结果:
请输入n的值:4
您的输入有误,n应为奇数。
请重新输入n的值:5
15 08 01 24 17
16 14 07 05 23
22 20 13 06 04
03 21 19 12 10
09 02 25 18 11
5次魔方阵常数:65
本文地址:https://blog.csdn.net/time_money/article/details/110245271