python解決約瑟夫問題

2021-09-26 09:08:44 字數 2397 閱讀 2988

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

1. 方法一

code:

list1 =

[i for i in

range(1

,42)]

# print(list1)

ls =

while

true:2

])list1 = list1[3:

:]+ list1[0:

2:]# print(list1)

iflen

(list1)==2

:break

print

(ls)

# 輸出 [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 1, 5, 10, 14, 19, 23, 28, 32, 37, 41, 7, 13, 20, 26, 34, 40, 8, 17, 29, 38, 11, 25, 2, 22, 4, 35]

print

(list1)

# 輸出 [16, 31]

解決約瑟夫問題的方法有許多種,在資料結構中,大部分都是用迴圈鍊錶來解決約瑟夫問題的,太複雜不會,這裡剛開始思考是分片操作拿出滿足的數,然後刪除這個數,將列表後再加乙個列表,可是這會改變列表的索引,隨著迴圈的次數增加,根本無法寫出滿足要求的算式,後來搜尋找到另乙個思路,只需要取出第n個需要的數,然後以這個數將列表拆開,將n之後的列表和n之前的列表組裝成乙個新的列表,如此只需迴圈下去便可得到需要的數,當列表的長度不滿足再進行重組列表操作時,但是當剩下的數小於n的時候,系統就會執行不了,因為數不到n,所以說這種方法還不是很好的,如果不是數3,而是數9 ,10 比較大的,就會留下很多數.

2.方法二

code:

list1 =

[i for i in

range(1

,42)]

n =1

a =0

while

len(list1)

>0:

if n ==3:

n =1print

(list1[a]

,end=

',')

list1.pop (a)

else

: n +=

1 a +=

1if a ==

len(list1)

: a =

0

這一種方法使用兩個變數進行控制,乙個變數控制計數,每數到3的時候變成1重新數,同時輸出並刪除掉這個數,另乙個變數控制著列表的索引,當迴圈走到列表結束時,賦值為0 ,意味著從列表頭部重新開始迴圈,兩個變數互不干擾,這樣就可以一直迴圈下去,列出所有人的死亡順序,一步到位.當然這個思路也可以用於字典,將列表換成字典,key為每個人的數字,從1開始,value都設為一,思路同上,只不過並不是刪除元素,而是更改value為0,然後加個判斷,如果迴圈到value為0的鍵,將控制鍵的變數加1 後繼續下次迴圈判斷,因為這裡沒有刪除,所以判斷value為0後仍要加1.**參考如下:

code:

people =

for x in

range(1

,42):

people[x]=1

i =1

j =0

while i <=42:

if i ==42:

i =1else

:if people[i]==0

: i +=

1else

: j +=

1if j >=3:

people[i]=0

j =0print

(i,end=

' ')

else

: i +=

1

python 用解決約瑟夫問題

coding utf 8 created on 2017年8月8日 author administrator 用python實現迴圈鍊錶,解決約瑟夫問題 class person def init self,num,next none self.next next self.num num defc...

python解決約瑟夫環問題

問題描述 編號為 1 n 的 n 個士兵圍坐在一起形成乙個圓圈,從編號為 1 的士兵開始依次報數 1,2,3 這樣依次報 數到 m 的 士兵會被殺死出列,之後的士兵再從 1 開始報數。直到最後剩下一士兵,求這個士兵的編號。有用遞迴函式 f n,m 的返回結果是存活士兵的編號,推導出old 與 new...

python超簡單解決約瑟夫環問題

明顯的約瑟夫環問題,python實現 如下 a x for x in range 1,31 生成編號 del number 8 該刪除的編號 for i in range 15 print a del number del a del nu程式設計客棧mber del number del numb...