1. 程式人生 > 其它 >藍橋杯:幻方填空——————Python

藍橋杯:幻方填空——————Python

技術標籤:藍橋杯python資料結構leetcode

題目
幻方是把一些數字填寫在方陣中,使得行、列、兩條對角線的數字之和都相等。

歐洲最著名的幻方是德國數學家、畫家迪勒創作的版畫《憂鬱》中給出的一個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