約瑟夫經典問題擴充套件成雙向約瑟夫問題

2022-10-03 23:54:16 字數 1437 閱讀 1000

約瑟夫問題是乙個經典的問題,我們不妨將這個經典問題進行擴充套件,變成乙個雙向的約瑟夫問題。

已知 n 個人(不妨分別以編號 1,2,3,...,n 代表 )圍坐在一張圓桌周圍,首先從編號為 k 的人從 1 開始順時針報數,1, 2, 3, ...,記下順時針數到 m 的那個人,同時從編號為 k 的人開始逆時針報數,1, 2, 3, ...,數到 m 後,兩個人同時出列。然後從出列的下乙個人又從 1 開始繼續進行雙向報數,數到 m 的那兩個人同時出列,...;。依此重複下去,直到圓桌周圍的人全部出列。直到圓桌周圍只剩乙個人為止。

如果雙向報數報到 m 時落在同乙個人身上,那本次出列的只有乙個人。

例如:5,1,2。則總共5個人,從1開始順時針報數,數到2,定位編號2;同時從1開始報數數到2,定位編號5;2和5同時出列。然後繼續開始報數,順時針報數3,4,定位到4;逆時針報數4,3,定位3;4和3同時出列。最後剩餘的為編號1。輸出為:2-5,4-3,1,。

如果輸入:6,2,3。則輸出:4-6,2,1-3,5,。其中第2次只輸出乙個2,表示第二次雙向報數時,恰好都落在編號2上,所以只有乙個編號出列。

輸入:n,k,m

輸出:按照出列的順序依次輸出編號。同時出列編號中間用減號"-」連線。

非法輸入的對應輸出如下

a)

b)測試輸入

1,0,0

1,2,1

5,1,2

測試輸出

n,m,k must bigger than 0.

k should not bigger than n.

2-5,4-3,1,

源**#include

#include

#include

typedef int elemtype;

int n,m,k; //定義乙個全域性變數

typedef struct dulnode //雙向迴圈鍊錶結構

dulnode,*dulinklist;

void create(dulinklist &h) //建立帶頭結點的雙向迴圈鍊錶

p->next=h;

h->prior=p;

} void delete(dulinklist &p) //刪除結點

int main()

if(k&程式設計客棧gt;n)

create(h);

r=h->next ;

while(r->data!=k)

l=r;

while(n)

r=right->;next;

l=left->prior;

if(r==h)

r=r->next;

if(l==h)

l=l->prior;

if(right!=left)

else

} printf("\n");

} 總結

雙向約瑟夫問題

約瑟夫問題是乙個經典的問題,我們不妨將這個經典問題進行擴充套件,變成乙個雙向的約瑟夫問題。已知 n 個人 不妨分別以編號 1,2,3,n 代表 圍坐在一張圓桌周圍,首先從編號為 k 的人從 1 開始順時針報數,1,2,3,記下順時針數到 m 的那個人,同時從編號為 k 的人開始逆時針報數,1,2,3...

經典約瑟夫環問題

1 coding utf 8 2 author diva 3 使用者輸入n,n代表人數,圍成一圈,順序排號 4 從第乙個開始報數,1,2,3,數到3的人,退出圈子 5 6 報數邏輯,數到3的把對應的位置置為0,直到剩下最後乙個人 7 def num report list create 8 n 0 ...

經典問題 約瑟夫環

約瑟夫環就是n個人圍在一起丟手絹。手絹每經過乙個人報乙個數,開始的時候從第乙個人開始報數1,報數依次增加。若報到3的人出局,並且下乙個人重新從1開始報數。直到局內剩下兩個人。這個問題的輸入有兩個。第乙個是n,參與遊戲的人數。第二個是m,最後留下的倖存者人數。輸出有一行,是倖存者的編號。這個問題有兩種...