約瑟夫問題是乙個經典的問題,我們不妨將這個經典問題進行擴充套件,變成乙個雙向的約瑟夫問題。
已知 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,最後留下的倖存者人數。輸出有一行,是倖存者的編號。這個問題有兩種...