迴圈鍊錶解決約瑟夫迴圈問題

2021-10-07 12:53:03 字數 1389 閱讀 8117

最近開始複習資料結構,今天手寫了乙個約瑟夫迴圈問題。

首尾相連的鍊錶:head->last=tail;tail->next=head

建立迴圈鍊錶和建立普通鍊錶方法差不多,只需要首尾相連即可

已知 n 個人(以編號1,2,3,…,n分別表示)圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那個人出列;他的下乙個人又從 1 還是順時針開始報數,數到 m 的那個人又出列;依次重複下去,要求找到最後出列的那個人。

例如:5個人,編號依次為12345,從第3個人開始報數,報到2的退出,然後下乙個接著從開始報數

那麼退出的順序是:4-1-3-2-5

思路:從第k個節點開始,將第m-1個節點釋放,連線好鍊錶即可。

#include

#include

using namespace std;

#include

struct list

;struct list*

creat

(int n)

//建立迴圈鍊錶

head-

>last = tail;

//首尾相連

tail-

>next = head;

//首尾相連

return head;

}void

delperson

(struct list* p)

cout <<

"請輸入m"

<< endl;

int m;

int i =0;

cin >> m;

while

(tail-

>next != tail)

//如果不是只剩最後乙個節點

tail-

>next = p-

>next;

//tail的next連線p的next

p->next-

>last = tail;

cout <<

"刪除的編號是:"

<< p-

>data << endl;

free

(p);

//釋放p

p = tail-

>next;

//p移動到tail的next

} cout <<

"刪除的編號是:"

迴圈鍊錶解決約瑟夫 問題

據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所...

迴圈鍊錶解決約瑟夫環問題

題目要求的約瑟夫環操作 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...

迴圈鍊錶解決約瑟夫環問題

問題描述 假設有n個小孩按照序號1,2,n圍坐成一圈,從第乙個小孩開始報數,每次報到n的人退出,接著從下乙個人重新開始從1開始報數,下一次再報到n的人退出,求最後乙個留下的人 小孩的個數n,和報數的n由鍵盤輸入 輸出留下人的序號 乙個迴圈鍊錶都寫得除出了很多問題,改了半天才出來 include in...