約瑟夫環問題

2021-07-10 09:27:09 字數 1807 閱讀 2019

問題來歷

據說著名猶太歷史學家 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報數,如此下去,直到所有人...