出题者好坏,看到题目都觉得用个循环链表很开心的就解决了,结果一看题目,一个next数组?!
其实题目是循环链表的变种,即 第i个人的下一个人的编号为next[i] ,然后像处理链表一样处理数组就OK了。
int josephus(int n,int s,int m)
{
int * next=new int[n];
assert(NULL!=next);
for (int i=0;i<n;i++)
{
next[i]=(i+1)%n;
}
int count=0;
int last_index=(n+s-1)%n;
int cur_index=s;
while(count<n)
{
for (int j=0;j<m-1;j++)
{
last_index=cur_index;
//
cur_index=next[cur_index];
}
printf("%d\r\n",cur_index);
next[last_index]=next[cur_index];
//
cur_index=next[cur_index];
//
count++;
}
return count;
}