约瑟夫问题。
約瑟夫問題。有n個人,編號為1,2,…,n,圍成一個圓圈,按照順時針方向從編號為k的人從1開始報數,報數為m的人出列,他的下一個人重新開始從1報數,數到m的人出列,一直這樣重復下去,直到所有的人都出列。要求編寫一個算法,輸入n、k和m,依次輸出每次出列人的編號。
算法描述如下:
void Josephus(LinkList h,int n,int m,int k)
/*在由n個人圍成的圓圈中,從第k個人開始報數,數到m的人出列*/
{
???????? ListNode *p,*q;
???????? int i;
???????? p=h;
???????? for(i=1;i<k;i++)?????????? /*從第k個人開始報數*/
???????? {
?????????????????? q=p;
?????????????????? p=p->next;
???????? }
???????? while(p->next!=p)
???????? {
?????????????????? for(i=1;i<m;i++)???????? /*數到m的人出列*/
?????????????????? {
??????????????????????????? q=p;
??????????????????????????? p=p->next;
?????????????????? }
?????????????????? q->next=p->next;?????? /*將p指向的結點刪除,即報數為m的人出列*/
?????????????????? printf("%4d",p->data);
?????????????????? free(p);
?????????????????? p=q->next;?????????????????????????? /*p指向下一個結點,重新開始報數*/
???????? }
???????? printf("%4d\n",p->data);
}
測試代碼由自己編寫,或參考零基礎學數據結構,機工社,
總結
- 上一篇: 哥哥,请原谅妹妹的自私!妹妹想做你的新娘
- 下一篇: 程序员水平分级 你属于哪一类?