解决问题过程图解
实现代码:
//n个竞争者,每隔m个竞争者就淘汰一个
//返回值为胜出的竞争者
int josephus(int n,int m)
{
list<int> lst;
for(int i=1;i<=n;i++) //给[1,n]个竞争者编号
{
lst.push_back(i);
}
cout<<"befor erase: "<<endl;
for(int x:lst)
{
cout<<x<<ends;
}
cout<<endl;
auto p=lst.begin(); //指向第一个竞争者
while(lst.size()!=1) //循环淘汰竞争者,直到只剩下一个
{
for(int i=0;i<m-1;i++)
{
p++;
if(p==lst.end()) //当p到达链表的表尾时,p加1,因为(lst.end())不指向任何元素
{
p++;
}
}
cout<<"erase num: "<<*p<<endl;
lst.erase(p++);
if(p==lst.end()) //假如上一句删除的是最后一个元素,则p++到达了lst.end();
{
p++;
}
}
return *p;
}
int main()
{
int res;
res=josephus(6,3);
cout<<endl;
cout<<"the winner is: "<<res;
return 0;
}
运行结果: