約瑟夫環問題和我們小時候玩的丟手帕遊戲類似,實現上沒有什麼難度,關鍵是要準確的用語言描述整個過程。首先還是先認識一下約瑟夫環問題:
編號為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報數,如此下去,直到所有人...