約瑟夫問題

2021-07-30 18:14:28 字數 2733 閱讀 3426

約瑟夫問題是經典的迴圈鍊錶。

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個人為止。問怎樣排法,才能使每次...