<c++>利用deque容器,解决约瑟夫环问题
2014-02-27 13:06
363 查看
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。(摘自百度百科)
用C++编程来解决这个问题的方法有很多,主要还是利用数组和链表,这次我将利用deque容器来解决这个问题。
解题思路:
1.我们可以想象成这n个人先是按顺序排成一排的,名字分别叫“1,2,3...n”,然后让名字为“k”之前的人按顺序排到“n”后面,这样“k”就排在第一个,“k-1”排在最后一个;(比如,k=3,那么排队顺序为“3,4,5,...,n,1,2”)
2.“k”开始报数,如果报到不是m,那么排到队末,然后下一个开始报,如果不是m,排到队末,一直到报到m的人就直接出列为止,然后再开始不断循环,每次循环出列一个人,直到队伍只剩下一个人为止;(比如,k=3,m=3,那么先是“3”排到队末,然后是”4“,”5“就直接出列,从”6“开始再循环......)
3.容器可以很方便的对其元素进行访问,添加和删除,我们可以把人名当成元素添加到容器里,然后对第一个元素进行处理;
4.关于容器的选择,我们要实现的功能是在容器首部或尾部插入或删除元素,能够高效地执行容器元素的随机访问,并且在尾部插入元素不会使任何迭代器失效,所以deque是比较好的选择。
代码如下:
假设n
= 9,k = 1,m = 5
编译结果:
用C++编程来解决这个问题的方法有很多,主要还是利用数组和链表,这次我将利用deque容器来解决这个问题。
解题思路:
1.我们可以想象成这n个人先是按顺序排成一排的,名字分别叫“1,2,3...n”,然后让名字为“k”之前的人按顺序排到“n”后面,这样“k”就排在第一个,“k-1”排在最后一个;(比如,k=3,那么排队顺序为“3,4,5,...,n,1,2”)
2.“k”开始报数,如果报到不是m,那么排到队末,然后下一个开始报,如果不是m,排到队末,一直到报到m的人就直接出列为止,然后再开始不断循环,每次循环出列一个人,直到队伍只剩下一个人为止;(比如,k=3,m=3,那么先是“3”排到队末,然后是”4“,”5“就直接出列,从”6“开始再循环......)
3.容器可以很方便的对其元素进行访问,添加和删除,我们可以把人名当成元素添加到容器里,然后对第一个元素进行处理;
4.关于容器的选择,我们要实现的功能是在容器首部或尾部插入或删除元素,能够高效地执行容器元素的随机访问,并且在尾部插入元素不会使任何迭代器失效,所以deque是比较好的选择。
代码如下:
#include <iostream> #include <deque> using namespace std; int findLast(int n, int k, int m) //定义函数,带有三个int型形参,自身返回int型,实现的功能是找到最后出列的那一个人 { deque<int> ideq; //创建deque容器,存放以k为首的n个元素 for (int x = k; x != n + 1; ++x) { ideq.push_back(x); } for (int y = 1; y != k; ++y) { ideq.push_back(y); } deque<int>::iterator iter = ideq.begin(); //定义迭代器 while (ideq.size() != 1)//一直循环,直到容器只剩下一个元素为止 { for (int cnt = 1; cnt != m; ++cnt)//循环(m-1)次 { ideq.push_back(*iter); //在尾部添加当前迭代器所指向的元素 iter = ideq.erase(iter); //删除当前位置的元素,返回的迭代器指向下一位置 } iter = ideq.erase(iter); // 此处意为数到m的人直接出列 } return *iter; //返回剩下的最后一个元素 } int main() { cout << "The last person:" << endl; cout << findLast(9, 1, 5) << endl; return 0; }
假设n
= 9,k = 1,m = 5
编译结果:
相关文章推荐
- [UE4]C++静态加载问题的解决方法 : TSubclassOf<> 蓝图赋值为nullptr
- 解决方法:关于问题 "C++ - Unresolved inclusion: <iostream>"
- C++容器--- 顺序性容器<deque>
- [翻译] C++ STL容器参考手册(第二章 <deque>)
- url 参数传递中文乱码问题 即<a href> 利用 js 的 encodeURI解决中文乱码问题
- <!--利用Spring的过滤器解决struts的编码问题 -->
- at com.genuitec.eclipse.ast.deploy.core.Deployment.<init>(Unknown Source)问题解决
- C++容器---关联式容器<set>&<multiset>
- C++ - "array<>"数组容器 详解
- 跨站脚本(XSS)的一些问题,解决<script>alert(42873)</script>
- 解决用<img src="<%# Eval("ShowPhoto")%>"动态绑定图片,发布到IIS上无法显示的问题
- <交流贴>四种方案解决ScrollView嵌套ListView问题
- <C++Primer>第四版 阅读笔记 第二部分 “容器和算法”
- C++ <利用指针翻转字符串>
- js正则:匹配一个html的tagname的开始标签,主要是解决包含&lt;&gt;(正则的效率问题建议不使用)
- 解决webApi<Message>An error has occurred.</Message>不能写多个Get方法的问题
- C++循环链表解决约瑟夫环问题
- C++ 顺序容器的操作(3) 关系运算符>、<、==、!=
- 超链接标签<a>缓存问题的解决
- <<让你自己的APP成为系统应用>>所遇到的问题及解决方法