欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

打印魔方阵(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