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

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

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

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

Q09 落單的男女

    人們聚集在某個活動會場上,根據到達會場的順序排成一排等待入場。假設你是活動的主辦人員,想把人們從佇列的
某個位置分成兩組。
    你想要讓分開的兩組裡每一組的男女人數都均等,但如果到場順序不對,可能出現無論怎麼分,兩組都不能男女均等的情況。
    舉個例子,有 3 位男性、 3 位女性以“男男女男女女 ” 的 順 序 到 場, 如圖所示,無論從佇列的那個位置分開,兩組的男女人數都不均等。但如果到場順序為“男男女女男女”,那麼只需要在第 4 個人處分組就可以令分開的兩組男女人數均等了。

                                                    

問題
       求男性 20 人、女性 10 人的情況下,有多少種到場順序會導致無論怎麼分組都沒法實現兩組男女人數均等?(原書,感覺有問題!)

       看原書分析,比較合理的問題應該是:

        求男性20人、女性10人的情況下,有多少種到場順序會導致無論怎麼分組都沒有任何一組內部男女人數能夠均等?

分析圖:

 

問題可簡化為:從0點至藍點,不經過紅點,有多少種可能?

利用最短路徑的思路:

                              

man_number = 20
female_number = 10

man_number += 1
female_number += 1
array = [[0]*man_number for i in range(female_number)]
array[1][0] = 1
array[0][1] = 1
for man in range(man_number):
    for female in range(female_number):
        if (man != female) and (man_number-man != female_number-female):
            try:
                if man > 0:
                    array[female][man] += array[female][man-1]
                if female > 0:
                    array[female][man] += array[female-1][man]
            except IndexError:
                pass
result = array[female_number-2][man_number-1] + array[female_number-1][man_number-2]
print("有%s種" % result)

執行結果:

            有2417416種