約瑟夫問題是經典的迴圈鍊錶。
1)內容: 約瑟夫(joseph)問題的一種描述是:編號為1,2,…, n 的n 個人按順 時針方向圍坐一圈, 每人持有乙個密碼(正整數)。一開始選任乙個正整數作為報數上限值m, 從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將它的密碼作為新的m值,再從下個人開始新一輪報數,如此反覆,直到剩下最後一人則為獲勝者。試設計乙個程式求出出列順序。
2)要求: 利用單向迴圈鍊錶儲存結構模擬此過程, 按照出列的順序印出各人的編號。
3) 測試資料: n=7,7 個人的密碼依次為:3,1,7,2,4,8,4 。m的初值為20,則正確的出列順序應為6,1,4,7,2,3,5
#include
#include
// 結構體的定義
typedef struct person person;
person * phead =
null; // 鍊錶的第乙個節點
person * ptail =
null; // 鍊錶的尾部
person * per =
null; // 用於遍歷
int n, m;
// 下面是函式的宣告
void create(); // 建立乙個鍊錶
void joseph(int m); // 約瑟夫問題的執行函式
int main(void)
void create() else
tail = person;
}// 因為是迴圈鍊錶,所以必須將尾與頭連線起來
tail->next = phead;
// 將函式中的尾節點賦給全域性變數中的尾節點
// 這個在後面有用
ptail = tail;}/*
* 因為最後最後每乙個人都會報數(最後乙個報數的為獲勝者)
* 一次遞迴出列乙個人,所以要需要遞迴n次
*/void joseph(int number)
// 用於報數,第乙個人報1所以初始值為1
int count =
1; // p用於記錄刪除的節點
person * p =
null;
// 前面記錄的為指標的用處就在這裡
// 當m=1時,第乙個人出列,所以就不用進行下面的迴圈
// 但是當m不等於1時,找到那個要出列的節點
while (count != m)
// p為要刪除的節點
p = per;
// 重置m
m = p->password;
// 從鍊錶中刪除p
ptail->next = per->next;
// 下面的是輸出出列人的編號
// 因為有些acm要求,用空格間隔,所以最後乙個不能有空格
if(number ==
1) printf("%d", p->
order);
else
printf("%d ", p->
order);
per = per->next;
// 釋放p
free(p);
// 進行下乙個遞迴
joseph(number -
1);
}
對於給定的1,2,3,…,n中的k個數,josephus想知道是否存在乙個正整數m(m≤n),使得josephus(n,m)排列的最後k個數恰好為事先指定的k個數。例如當n為7,k為4,指定排列的最後k個數為7,5,1,4時;由於(7,3)josephus排列為3,6,2,7,5,1,4;所以求得m值為3。
這個約瑟夫排列問題,每個人都沒有密碼,只有乙個初始值,當報到這個人時出列。要求找乙個滿足題目要求的初始值m。
#include
#include
typedef struct person person;
person * phead = null; // 鍊錶的第乙個節點
person * pfront = null;
person * per = null;
int n, m;
int b[100], k;
// 函式
void create();
void joseph(int number, int
m);int main(void)
for (i = 1; i <= n; i++)
}if (flag == 1)
// printf("\n");
}printf("0");
return
0;}
void create() else
tail = person;
}tail->next = phead;
pfront = tail;
}void joseph(int number, int
m) int count = 1;
person * p = null;
while (count != m)
p = per;
pfront->next = per->next;
if(number == 1)
else
per = per->next;
free(p);
joseph(number - 1, m);
}
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫問題
這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...