藍橋杯:幻方填空——————Python
阿新 • • 發佈:2021-01-18
題目
幻方是把一些數字填寫在方陣中,使得行、列、兩條對角線的數字之和都相等。
歐洲最著名的幻方是德國數學家、畫家迪勒創作的版畫《憂鬱》中給出的一個4階幻方。
他把1,2,3,...16 這16個數字填寫在4 x 4的方格中。
如圖p1.jpg所示,即:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些數字已經顯露出來,還有些用?和*代替。
請你計算出? 和 * 所代表的數字。並把 * 所代表的數字作為本題答案提交。
Code
#幻方填空 12
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
12