約瑟夫問題(模擬)----python

問題來歷

據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重新報數,直到所有人都自殺身亡爲止。然而Josephus 和他的朋友並不想遵從。首先從一個人開始,越過k-2個人(因爲第一個人已經被越過),並殺掉第k個人。接着,再越過k-1個人,並殺掉第k個人。這個過程沿着圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活着。問題是,給定了和,一開始要站在什麼地方纔能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

一般形式

約瑟夫問題是個有名的問題:N個人圍成一圈,從第一個開始報數,第M個將被殺掉,最後剩下一個,其餘人都將被殺掉。例如N=6,M=5,被殺掉的順序是:5,4,6,2,3,1。

代碼實現

這個問題並不難,求解的方法也很多,乍一看這個其實一般讓人想到數據結構中的循環鏈表,個人覺得有時候數組比鏈表更好用,我們可以用python實現一個的循環數組,就像循壞隊列的概念一樣。以下是上述問題的python代碼實現:

number = [1,2,3,4,5,6]
m = 5
temp = 0
while(len(number) != 1):
    temp = (temp+m-1+len(number))%len(number)   #每次確定應該剔除哪個數所在索引位置
    number.pop(temp)
print(number[0])

 以上問題在一些程序設計比如LeetCode、牛客網中也稱爲孩子們的遊戲(圓圈中最後剩下的數)。這裏使用數組的話,至少數組在創建的時候比鏈表方便。當然數組中的數可以自己輸入用input()函數接收,不一定是上面的1,2,3,4,5,6。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章