您的位置:首页 > 理论基础 > 数据结构算法

C++数据结构--循环链表的应用--解决约瑟夫问题

2013-07-31 10:25 295 查看
解决问题过程图解






实现代码:



//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;


}

运行结果:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: