(C )約瑟夫問題(Josephus)

2021-08-22 18:08:02 字數 1701 閱讀 4703

(easy版本)已知 n 個人(以編號1, 2, 3 ,4, 5 ,6  ... .. .n)圍坐一張圓桌周圍。從編號為s 的人開始報數,數到m 的那個人出列;他的下乙個人又從 1開始報數,數到m的那個人又出列;依次規律重複下去,直到圓桌周圍的人全部出列。

#include using namespace std;

struct node

;main()

current->next=head;

current = head; //遍歷迴圈鍊錶,輸出序列

dowhile(current!=head);

current = head; //將current置於第s個位置

for(int i=1;inext;

}cout << endl;

for(int i=1;i<=n;i++) //共迴圈n輪,得到乙個整體的輸出序列

cout << current->data << " ";

prev->next = current->next;

delete current;

current = prev->next;}}

(hard版本)題目:約瑟夫雙向生死遊戲是在約瑟夫生者死者遊戲的基礎上,正向計數後反向計數,然後再正向計數。具體描述如下:30(numofpeople)個旅客同乘一條船,因為嚴重超載,加上風高浪大,危險萬分;因此船長告訴乘客,只有將全船一半(numofkilled)的旅客投入海中,其餘人才能倖免遇難。無奈,大家只得同意這種辦法,並議定30個人圍成一圈,由第乙個人開始,順時針依次報數,數到第9(forwardcount)人,便把他投入大海中,然後從他的順時針的下乙個人數起,逆時針數到第5(reversecount)人,將他投入大海,然後從他逆時針的下乙個人數起,順時針數到第9人,再將他投入大海,如此迴圈,直到剩下15個乘客為止。問哪些位置是將被扔下大海的位置。

#include using namespace std;

struct node

;main()

current->next=head->next;

head->next->prior=current;

current = head->next; //遍歷迴圈鍊錶,輸出序列

for(int i=1;i<=n;i++) 

current = head->next; //將current置於第s個位置

for(int i=1;inext;

}cout << endl;

for(int i=1;i<=15;i++) //共迴圈***,得到乙個輸出序列

cout

prev->next=current->next;

current->next->prior=prev;

delete current;

current=prev->next;

}else           //逆向 

cout

prev->prior=current->prior;

current->prior->next=prev;

delete current;

current=prev->prior;}}

return 0;

}

截圖:

C 約瑟夫(Josephus)問題

一 題目 約瑟夫問題 n個人圍成一桌,數到m的人出列 二 實現方法1 每齣列乙個,就往前移動陣列,用求餘解決到尾問題 每齣列乙個,就往前移動陣列 用求餘解決到尾問題 include void josephus int n,int m,int start std cout arr 0 n int ma...

Josephus 約瑟夫 問題

問題描述 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到剩下最後乙個人。程式的意圖是求出最後留下的人的編號。c 實現 include include include u...

約瑟夫(Josephus)問題

一群小孩圍成一圈,任意假定乙個數n,從第乙個小孩起,順時針方向數,每數到第m個小孩時,該小孩便離開。小孩不斷離開,圈子不斷縮小。最後剩下的乙個小孩便是勝者。求勝者的編號?函式名稱 josephus 作 成 者 erick.wang 作成日期 2016 07 19 返 回 值 void 參 數 m,n...