頭疼的演算法與資料結構 約瑟夫環

2021-07-28 10:15:42 字數 1005 閱讀 4628

據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 

個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個

人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 

和他的朋友並不想遵從,josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

前見天寫了迴圈鍊錶,用迴圈鍊錶要實現這個問題。

#include struct node;

typedef struct node node;

#define size sizeof(node)

int num=1;//計算迴圈鍊錶的節點個數 頭節點已經建立好了 有乙個節點了

//建立節點

node* cretenode(int d)

//建立鍊錶

void creatlist(node** h)

pn=cretenode(d);

++num;

p->next=pn;

p=p->next;

}}int main()

printf("%d->",p->next->data);

temp=p->next;//刪除死亡的人

p->next=temp->next;

free(temp);

p=p->next;

}printf("%d\n",p->data);

return 0;

}

請輸入資料 8

請輸入資料 9

請輸入資料 7

請輸入資料 65

請輸入資料 4

請輸入資料 1

請輸入資料 2

請輸入資料 3

請輸入資料 0

7->1->8->4->9->3->65->2

資料結構 約瑟夫環

問題描述 約瑟夫環問題的一種描述是 編號為1,2,n的n個人按順時針的方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數的上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他的順時針方向上的下乙個人開始重新報數,如此下...

C 資料結構與演算法 解決約瑟夫環問題

問題描述 編號為 1 n 的 n 個士兵圍坐在一起形成乙個圓圈,從編號為 1 的士兵開始依次報數 1,2,3 這樣依次報 數到 m 的 士兵會被殺死出列,之後的士兵再從 1 開始報數。直到最後剩下一士兵,求這個士兵的編號。方法 遞迴 優點 少 缺點 效率低,堆疊會溢位 其實這道題還可以用遞迴來解決,...

資料結構 約瑟夫環問題

實驗一線性表的應用 實驗目的和要求 通過實驗進一步理解線性表的邏輯結構和儲存結構,提高使用理論知識指導解決實際問題的能力,熟練掌握鍊錶的實際應用。主要內容 題目1 josephus環問題 問題描述 約瑟夫 joseph 問題的一種描述是 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼...