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

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

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

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

Q14 世界盃參賽國的國名接龍

    2014 年 FIFA 世界盃的 32 個參賽國

                              

    舉個例子,如果像下面這樣,那麼連續 3 個國名之後接龍就結束了(因為沒有英文名稱以 D 開頭的國家)。
                 “Japan” →“Netherlands” →“Switzerland”

    問題
        假設每個國名只能使用一次,求能連得最長的順序,以及相應的國名個數。

country_list = ["Brazil", "Croatia", "Mexico",
                "Cameroon", "Spain", "Netherlands",
                "Chile", "Australia", "Colombia",
                "Greece", "Cote d'Ivoire", "Japan",
                "Uruguay", "Costa Rica", "England",
                "Italy", "Switzerland", "Ecuador",
                "France", "Honduras", "Argentina",
                "Bosnia and Herzegovina", "Iran", "Nigeria",
                "Germany", "Portugal", "Ghana",
                "USA", "Belgium", "Algeria",
                "Russia", "Korea Republic", ]

max_country_list = []

def find_next_country(used_country_list, country_map):
    bfind = False
    if len(country_map) != 0:
        for index, c in enumerate(country_map):
            if c[0] == used_country_list[-1][-1].upper():
                find_next_country(used_country_list + [c], country_map[:index] + country_map[index + 1:])
                bfind = True
    if not bfind or len(country_map) == 0:
        global max_country_list
        if len(max_country_list) < len(used_country_list):
            max_country_list = used_country_list

for i, country in enumerate(country_list):
    find_next_country([country], country_list[:i]+country_list[i+1:])

print("能連得最長的國名個數為:%s\n%s" % (len(max_country_list), max_country_list))

 

執行結果:

                 能連得最長的國名個數為:8
                 ['Korea Republic', 'Cameroon', 'Netherlands', 'Spain', 'Nigeria', 'Australia', 'Argentina', 'Algeria']