問題描述
n個人站成一圈,每個人有不同的編號i,從編號為1的人開始順時針防線迴圈報數,數到m的人出列。然後從出列者的下乙個人重新報數,如此重複,直到全部出列。輸出n個人的出列順序。
思路
元素位置標記為0,1,2,…n-1。
設t為輸出元素位置,初始值0,則輸出元素位置為t=(t+m-1)%n
t位置後的元素後移,列表元素個數n=n-1。
#define maxsize 100
typedef structsqlist;
void yuesefu(sqlist &l,int n,int m){
int t=0;
for(i=0;i0){
t=(t+m-1)%n;
printf("%d",l.a[t]);//列印元素
for(j=t+1;j寫在最後
約瑟夫環最為經典的問題,本題用的是順序表(陣列)的方法解決。
後面會補一下鍊錶和遍歷的解法
最基本的演算法練到爛熟也是殺手鐗(阿里演算法題中也出現過)。
約瑟夫環問題(C語言)
n個人站成一圈,每個人有不同的編號i,從編號為1的人開始順時針防線迴圈報數,數到m的人出列。然後從出列者的下乙個人重新報數,如此重複,直到全部出列。輸出n個人的出列順序。元素位置標記為0,1,2,n 1。設t為輸出元素位置,初始值0,則輸出元素位置為t t m 1 n t位置後的元素後移,列表元素個...
約瑟夫環問題 C語言
問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。...
約瑟夫環 C語言
約瑟夫 joseph 問題的一種描述是 編號為1,2,3,n的n個人按順時針方向圍坐一圈。每人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數,令其出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始重新報數,如此下去...