問題來歷
據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第k個人。接著,再越過k-1個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
數學模型
已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1排列,最後結果+1即為原問題的解。對任意給定的n、k、m,
(1)假設最後乙個人為勝利者,那麼勝利者是原來的第幾個人。
(2)求按出列次序得到的n個人員的順序表。
思路鍊錶方法
這是約瑟夫環問題的實際場景,通過輸入n,m,k三個正整數,來求出列的序列。採用的是迴圈鍊錶的資料結構
解決問題的核心步驟:
1.建立乙個具有n個鏈結點,無頭結點的迴圈鍊錶
2.確定第1個報數人的位置
3.不斷地從鍊錶中刪除鏈結點,直到鍊錶為空
demo
public
class
linkedlist
public
void
addhead(int i)
size++;
}public
void
addtail(int i)
public
static
void
main(string args)
system.out.println(ll.size);
system.out.println("head: " + ll.head.getitem() + " next: " + ll.head.getnext().getitem()
+ " next: " + ll.head.getnext().getnext().getitem()
+ " next: " + ll.head.getnext().getnext().getnext().getitem()
+ " next: " + ll.head.getnext().getnext().getnext().getnext().getitem()
+ " next: " + ll.head.getnext().getnext().getnext().getnext().getnext().getitem());
// 1 2 3 4 5 6 7 8
node temp = ll.head;
for (int i = 0; i < k -1 ; i++)
while (ll.size != 0)
}}class node
public
node(int no, node next)
public
intgetitem()
public
void
setnext(node next)
public node getnext()
}
2.
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫環問題
約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...