1. 程式人生 > >《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q18)

《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q18)

《程式設計師的演算法趣題》-(日)增井敏克 , 書中為69 道數學謎題編寫了解題程式, 程式語言為:Ruby,JavaScript,C語言。有興趣的同學,可以購書閱讀~

在此更新個人編寫的Python版,僅供學習使用。(執行環境:Python3.6)

Q18 水果酥餅日

    日本每月的 22 日是水果酥餅日。因為看日曆的時候, 22 日的上方剛好是 15 日,也就是“‘22’這個數字上面點綴著草莓”(如果將日語的 15 拆為 1 和 5 發音,則與日語“草莓”一詞發音相同,而水果酥餅中最為著名的就是草莓酥餅。)

    切分酥餅的時候,要求切分後每一塊上面的草莓個數都不相同。假設切分出來的 N 塊酥餅上要各有“1~N 個(共 N(N + 1)÷2 個草莓)”。但這裡要追加一個條件,那就是“一定要使相鄰的兩塊酥餅上的數字之和是平方數”。
    舉個例子,假設 N = 4 時採用如 圖的切法。這時,雖然 1 + 3 =4 得到的是平方數,但“1 和 4” “2和 3” “2 和 4”的部分都不滿足條件。

                                                              

問題
      求可以使切法滿足條件的最小的 N(N > 1)。

import math

def check_cake_list(start_cake, use_list, sqrt_list):
    for index, number in enumerate(use_list):
        if (start_cake + number) in sqrt_list:
            res_cakes = use_list[:index] + use_list[index+1:]
            if len(res_cakes) == 0:
                if (number + 1) in sqrt_list:
                    return True
            if check_cake_list(number, res_cakes, sqrt_list):
                return True

    return False

N = 2
while True:
    cake_list = [i for i in range(2, N+1)]
    sqrt_numbers = [i*i for i in range(1, int(math.sqrt(N*2))+2)]

    if check_cake_list(1, cake_list, sqrt_numbers):
        break

    N += 1

print("最小的N為:%s" % N)

執行結果:

                 最小的N為:32