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

2021-10-08 11:48:49 字數 1041 閱讀 9351

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

本題牛客鏈結環形鍊錶的約瑟夫問題

輸入描述:

一行兩個整數n和m,n表示環狀鍊錶的長度,m表示每次報數到m就自殺。

輸出描述:

輸出最後存活下來的人編號(編號從1開始到n)

示例1輸入

5 2輸出

3

使用迴圈鍊錶ac**:

#include

using

namespace std;

typedef

struct node

*node;

intmain()

p->next=head;

p=head;

q=head;

while(1

)if(q->next==q)

break

; q-

>next=p-

>next;

delete p;

q=q-

>next;

p=q;

} cout<

>data;

}

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

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

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

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

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

約瑟夫環問題可以簡單的使用陣列的方式實現,但是現在我使用迴圈鍊錶的方法來實現,因為上午看到一道面試題規定使用迴圈鍊錶解決約瑟夫環問題。什麼是約瑟夫環?這道面試題考察了迴圈鍊錶的 建立 遍歷 和 刪除 建立的迴圈鍊錶的結構圖 解決約瑟夫環問題的過程 c 實現 如下 1 迴圈鍊錶解決約瑟夫環問題 2 問...