利用迴圈鍊錶求解約瑟夫問題

2021-10-08 04:27:46 字數 1274 閱讀 8793

這題其實就是約瑟夫問題換了個·皮。用迴圈鍊錶解決的話思路最清晰,**如下,注意看注釋的解釋。

using system.collections.generic;

class

circlenode

//建立迴圈鍊錶節點

class

solution

temp.next=head;

//迴圈結束,所有節點已經插入,則讓temp指向頭節點,形成迴圈鍊錶

return head;

}public

circlenode

deletecirclenode

(circlenode head,

int m)

circlenode temp=head;

//temp代表當前遍歷的節點

int count=0;

while

(temp.next!=temp)

//當鍊表還剩下多於1個節點的時候就會執行刪除操作

tail=temp;

temp=temp.next;

count++;}

return temp;

}public

intlastremaining_solution

(int n,

int m)

circlenode head=

initcriclelist

(n);

return

deletecirclenode

(head,m)

.number;

}}

順便去搜了一下約瑟夫問題的背景故事,發現還挺有趣:

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

用迴圈鍊錶求解約瑟夫環問題

約瑟夫環問題 已知 n 個人 n 1 圍坐一圓桌周圍,從 1 開始順序編號,從序號為 1 的人開始報數,順時針數到 m 的那個人出列。下乙個人又從 1 開始報數,數到m 的那個人又出列。依此規則重複下去,直到所有人全部出列。請問最後乙個出列的人的初始編號。輸入輸出 輸入人數 n,所報數 m,輸出最後...

迴圈鍊錶求解約瑟夫問題 C語言

include include stdlib.h struct node 建立乙個結點結構體 int main else 建立乙個不帶頭結點的單鏈表 q next head 將單鏈表組成環狀,形成迴圈單鏈表 printf n printf 之前的序列為 n q head while q next h...

資料結構 迴圈鍊錶求解約瑟夫環問題

開啟部落格,竟然有兩個多月沒更新部落格了。最近一直在忙著準備實習招聘,所以沒有學習什麼android的新的東西,而是在學習招聘中最被重視之一的資料結構與演算法,而自己又非科班出身,哎.也許沒那麼難,加油!另外,對於這個部落格,我是想專門寫一些安卓的知識方便自己回顧還有比我新手的來參考的,就像我收藏的...