''' 魔方阵是我国古代发明的一种数字游戏: 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