day11 幻方填空

幻方填空

幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。

欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。
如图p1.jpg所示,即:

16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1

表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
def isMS(array):  # 先定义一个判断是否为幻方的函数
    for i in range(4):
        if sum(array[i]) != 34:
            return False
    for j in zip(array[0],array[1],array[2],array[3]):
        if sum(j) != 34:
            return False
    if sum([array[0][0],array[1][1],array[2][2],array[3][3]])!=34:
        return False
    if sum([array[0][3],array[1][2],array[2][1],array[3][0]])!=34:
        return False
    return True


import itertools
array = [				# 为了在isMS()中调用zip()更好的解决问题
    [16, 0, 0, 13],		# 在这里我们把幻方的结构设定为矩阵而非一元数组
    [0, 0, 11, 0],
    [9, 0, 0, 0],
    [0, 15, 0, 1]
]
num_lst = [2, 3, 4, 5, 6, 7, 8, 10, 12, 14]
position_lst = []		# 通过一个小循环获取要填写的位置,省的自己打了
for i in range(4):
    for j in range(4):
        if array[i][j] == 0:
            position_lst.append((i, j))
for num_tpl in itertools.permutations(num_lst):
	# 核心就是暴力破解,没啥好说的,奥利给
    for cnt, (i, j) in enumerate(position_lst):
        array[i][j] = num_tpl[cnt]
    if isMS(array):
        print(array[2][3])
        break

猜你喜欢

转载自blog.csdn.net/qq_51174011/article/details/112754793