用迴圈單鏈表解決約瑟夫(Joseph)問題

2021-10-03 21:35:31 字數 1364 閱讀 9167

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

首先,所需要的資料結構是帶有頭結點的迴圈單鏈表,並且鍊錶尾指標一定要指向頭結點,(如果指向第乙個帶有資料的結點,則會出現指標斷裂情況),每次執行程式需要手動輸入參與約瑟夫環的人數,即鍊錶中結點數,每數3個結點刪除乙個結點,直到鍊錶中的元素結點個數為零為止,依次列印輸出的結點。

typedef

struct joseph

joseph,

*pjoseph;

void

main()

printf

("\n輸出的序列依次是:\n");

josephvel->next = joseph;

// 形成迴圈鍊錶

int index =1;

josephvel = joseph;

pjoseph pcurjoseph = joseph->next;

while

(size >0)

printf

("%d "

, pcurjoseph->val)

; josephvel->next = pcurjoseph->next;

free

(pcurjoseph)

; pcurjoseph = josephvel->next;

size--

; index =1;

}if(pcurjoseph == joseph)

// 如果指向頭結點 指標下移

// 不到3個人的時候 依舊下移

用迴圈單鏈表解決約瑟夫(Joseph)問題

用迴圈單鏈表解決約瑟夫 joseph 問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該...

約瑟夫問題,用java單鏈表解決

設編號為1,2,3.n,的n個人圍坐一圈,約定編號為k 1的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的人又出列,以此類推,直到所有人出列為止,由此產生乙個出隊編號的序列 由k節點起從1開始計數,計到m時,對應節點從鍊錶中刪除,然後再從被刪除節點的下乙個節點 又從1開始計數...

運用迴圈單鏈表解決約瑟夫環問題

include using namespace std struct node 構造結點 為結點初始化 分配空間 int data node next class josephus void create 鍊錶的初始化 void output 輸出數值 private node head 迴圈鍊錶的...