據說著名猶太歷史學家 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...