約瑟夫環問題

2021-06-27 06:46:38 字數 1525 閱讀 4429

約瑟夫環問題和我們小時候玩的丟手帕遊戲類似,實現上沒有什麼難度,關鍵是要準確的用語言描述整個過程。首先還是先認識一下約瑟夫環問題:

編號為1-n的n個人圍坐一圈,每個人持有乙個密碼牌(正整數),開始人首先選擇乙個正整數m作為作為要報數的上限值,然後從第乙個人按順時針從1開始報數。報道m數時停止報數。報m數的人出列,同時將它的密碼牌上的書作為新的m值,從他順時針方向的下乙個人按順時針從1開始報數。直到所有的人出列。

見下圖:

假設開始人選為a,初始密碼為1,則出列順序為:a->c->d->b->f->e

根據上述描述,我們考慮使用單向迴圈列表來實現,**如下:

#include#include#define max_node 100

struct node

;//建立乙個新的結點

node *getnode(int id, int icipher)

pnew->id = id;

pnew->cipher = icipher;

pnew->next = null;

return pnew;

}//建立單向迴圈列表

void buildlist(node** pnode, int n)

pnew->next = pcur->next;

pcur->next = pnew;

pcur = pnew;

}printf("單向迴圈鍊錶的建立完成!\n");

}//列印迴圈佇列

void print(node *pnode) while (pcur != pnode);

getchar();

}void startgame(node** phead, int ichipher)

while (isflag)

if (pprv == pcur)

pdel = pcur;

pprv->next = pcur->next;//刪除找到的結點

pcur = pcur->next;

ichipher = pdel->cipher;

printf("第%d個結點出列, 密碼: %d\n", pdel->id, pdel->cipher);

free(pdel);

}*phead = null;

getchar();

}int main(void)

else

break;

}buildlist(&phead, n);

printf("\n------------> 原始情況

print(phead);

printf("\n------------->出隊情況

startgame(&phead,m);

}

執行結果:

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...

約瑟夫環問題

約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...