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;
}
运行结果:
实现代码:
//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;
}
运行结果:
相关文章推荐
- 数据结构学习系列三-单向循环链表(c++实现且应用模板)
- 简单数据结构之循环链表(C++实现)
- JavaScript数据结构之单向循环链表应用-约瑟夫问题
- 数据结构(4)--循环链表的应用之约瑟夫环问题以及线性表总结之顺序表与链表的比较
- c++ 数据结构 双向循环链表
- 计蒜客 数据结构 链表 ——应用筛选简历 C++
- C++ 数据结构应用——链表
- C++实现数据结构三 双向循环链表
- 使用双向循环链表解决约瑟夫问题
- 【数据结构】双循环链表(c++)
- 【C++/数据结构】循环链表的基本操作
- 2015年大二上-数据结构-链表(6)-循环双链表应用
- 【数据结构】用C++实现双循环链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄
- 【C++数据结构】模版类实现双循环链表的基本操作
- 数据结构 循环链表的应用:约瑟夫环问题
- C语言数据结构之利用循环链表解决约瑟夫问题
- 【C++数据结构】循环双向链表
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 数据结构三:循环链表解决约瑟夫问题实现