雙向約瑟夫問題

2021-07-29 23:09:18 字數 1551 閱讀 5282

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

已知 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) 輸入:n、k、m任乙個為0

輸出:n,m,k must bigger than 0.

b)輸入:k>n

輸出:k should not bigger than n.

測試輸入

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#includetypedef 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>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...

約瑟夫問題 猴子選大王 雙向指標

題目大意 有n只猴子 編號為1 n 圍成一圈,從第一只猴子開始數,數到第m只出列,直到只剩下乙隻猴子,打出這只猴子編號。分析 這道題很顯然是用指標做最簡單。額 廢話不多說 程式裡會有注釋 如下 include includestruct node struct node h,p,q 定義些臨時指標 ...

資料結構基礎 雙向約瑟夫問題

成績 15開啟時間 2017年09月27日 星期三 00 05 折扣0.8 折扣時間 2017年10月20日 星期五 23 55 允許遲交 否關閉時間 2018年01月8日 星期一 23 55 約瑟夫問題是乙個經典的問題,我們不妨將這個經典問題進行擴充套件,變成乙個雙向的約瑟夫問題。已知 n 個人 ...