// 约瑟夫问题:
/*
问题描述:
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。
从数列第k个位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,
然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。
请编程实现上述计数过程,同时输出数值出列的顺序
比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。
输出数值出列顺序为:2,3,1,4。
入口参数:
n:输入的字符的个数
k: 初始计数位置
m: 初始计数值m
*/
void josephus(int n,int k,int m){
LinkList head;
InitList_loop(head);
for(int i=1;i<=n;i++)
{
ListInsert_loop(head,i,i);
}
Travese_loop(head,print);
LinkList P,q;
P = head;
while(P->next!=P)
{
for(int j=1;j<m+k;j++)
{
q = P;
P = P->next;
if(P == head)
m++;
}
m = P->data ;
print(m);
q->next = P->next; // delete P node;
P = P->next;
k = 0;
}
}