題目:編號爲1,2… n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作爲報數的上限值m,從第一個人開始按順時針方向自1開始順序報數, 報到m時停止報數,報m的人出列,將他的密碼作爲新的m值,從他的順時針方向上的下一個開始重新從1報數,如此下去,直至所有人全部出列爲止,設計一個程 序求出出列順序。
//Josephus
#include<iostream>
using namespace std;
typedef struct LNode
{
int num; //編號
int code; //密碼
struct LNode *next;
}LNode;
void create(LNode *&tail, int m, int n)
{
LNode *p, *q; //輔助節點
LNode *head; //頭結點
if(n < 1) //人數異常, 退出程序
{
cout << "Number error!" << endl;
system("pause");
exit(1);
}
if(n == 1)
{
cout << "1" << endl;
system("pause");
exit(0);
}
//當 n >= 2 時
head = new LNode;
p = head;
p -> num = 1;
cin >> p ->code; //輸入第一個密碼
for(int i = 2; i <= n; i++)
{
q = new LNode;
p -> next = q;
q -> num = i; //寫入編號
cin >> q -> code; //輸入其餘的密碼
p = q; //p指向已建鏈表的最後一個節點
}
tail = p;
tail -> next = head; //建立循環鏈表
}
void run(LNode *&tail, int m, int n)
{
LNode *p, *q; //輔助節點
p = tail;
for(int i = 1 ; i <= n; i++)
{
for(int j = 1; j < m; j++) //p定位在出列者的前一人
{
p = p -> next;
}
q = p -> next; //q指向出列者
cout << q -> num; //輸出出列者的編號
i < n ? cout << ' ' : cout << endl;
m = q -> code; //更新報數上限
p -> next = q -> next; //p指向出列者的下一人
delete q; //刪除出列者節點
}
}
int main()
{
LNode *tt; //尾節點
int m; //報數上限
int n; //人數
cout << "Input the number of people: ";
cin >> n;
cout << "Input the first code: ";
cin >> m;
create(tt, m, n);
run(tt, m, n);
return 0;
}