2013/Province_C_C++_C/4/幻方填空
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。
如图p1.jpg所示,即:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
解题思路:
通过itertools模块令剩下的10个数进行一次全排列,利用for循环遍历寻找出符合条件的情况。
代码:
import itertools
list1 = [2, 3, 4, 5, 6, 7, 8, 10, 12, 14]
list2 = list(itertools.permutations(list1, 10))
list3 = [
[16, '?', '?', 13],
['?', '?', 11, '?'],
[9, '?', '?', '*'],
['?', 15, '?', 1]
]
for i in list2:
list3[0][1] = i[0]
list3[0][2] = i[1]
list3[1][0] = i[2]
list3[1][1] = i[3]
list3[1][3] = i[4]
list3[2][1] = i[5]
list3[2][2] = i[6]
list3[2][3] = i[7]
list3[3][0] = i[8]
list3[3][2] = i[9]
if sum(list3[0]) == sum(list3[1]) == sum(list3[2]) == sum(list3[3]) ==\
sum(list3[a][0] for a in range(0, 4)) ==\
sum(list3[b][1] for b in range(0, 4)) ==\
sum(list3[c][2] for c in range(0, 4)) ==\
sum(list3[d][3] for d in range(0, 4)) ==\
(int(list3[0][0]) + int(list3[1][1]) + int(list3[2][2]) + int(list3[3][3])) ==\
(int(list3[0][3]) + int(list3[1][2]) + int(list3[2][1]) + int(list3[3][0])):
print(list3[2][3])
break
# 输出结果如下
12
u1s1,itertools模块解蓝桥杯的题真的好用!(虽然有弊端…)