題目:
約瑟夫環的一種描述為 編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數)。
一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。
報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。
測試資料:
n=7,7個人的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序應為6,1,4,7,2,3,5,)
n=9,9個人的密碼依次為:4,3,7,1,5,6,3,8,2,首先m值為4(正確的出列順序應為4,5,1,7,2,8,3,6,9,)
編譯環境:vc 6.0
typedef struct listnode
listnode,*link;//link為指向結構體listnode的指標型別
typedef structsqlist;
void initlist(sqlist &list)
int listinsert(sqlist &list,int i,int num)
q=(link)malloc(sizeof(listnode));
q->listnum=i;
q->data=num;
q->out=1;
q->next=p->next;p->next=q;
if(i==++list.len)
list.rear=q;
return ok;
}int locateelem(sqlist list)
if(r==s)
r=list.head;
r=r->next;
} return 0;
}void printlist(sqlist list)/*用於測試資料是否儲存入單鏈表*/
}int main()
dowhile(m<=0);
//printlist(list2);printf("\n");
printf("出列順序為:");
flag=locateelem(list2);
} printf("\n");
return 0;
}
迴圈鍊錶實現約瑟夫環
約瑟夫問題 有n個人圍坐一圈,從第k個人開始數,數到m的那個人出隊。知道最後乙個人出隊。有11個人,從第2個人開始數,數到3的那個人出隊。如下簡圖 這裡有兩個關鍵 1 建立迴圈佇列 不能有頭結點 2 隔m 1步取出該節點 程式如下 include using namespace std typede...
約瑟夫環,迴圈鍊錶實現
約瑟夫環的定義就不再贅述,直接上 如果朋友能看完這個 相信你能理解接下面這個小故事。有個人想從這個世界上消失,但是他又不想死,他想到了乙個辦法,他可以把另外乙個人殺了,然後再用這個人的身份生活下去。這個小故事與約瑟夫環無關 include include struct node int main e...
迴圈鍊錶實現約瑟夫環
首先我們先上圖幫助理解 環狀順序佇列 top為隊首指標 rear為隊尾指標 我們需要注意,順序佇列在判斷陣列中資料是否存滿時,會出現下面情況 由上我們發現 我們為了區分二者,最簡單的解決辦法是 犧牲掉陣列中的乙個儲存空間 迴圈佇列的操作 i.size為順序佇列申請的空間大小 ii.q 為資料集合 出...