约瑟夫环问题
来源:互联网 发布:电商美工工资待遇 编辑:程序博客网 时间:2024/03/29 10:32
题目描述
约瑟夫问题是一个非常著名的趣题,即由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。
给定两个int n和m,代表游戏的人数。请返回最后一个出局的人的编号。保证n和m小于等于1000。
测试样例:
5 3
返回:4
----------------------------------------------------------------------------------------------------------------------------------------------------------
据说著名犹太历史学家Josephus在罗马人占领了乔塔帕特之后,39个犹太人与Josephus及他的朋友躲到山洞,39个犹太人决定宁愿死都不要被敌人抓到,于是决定了一种自杀的方式,41个人排成一个圈子,
由第一个人开始报数,报到3的人就自杀。然后再由下一个人开始重新报1,报到3的再自杀,这样再一直下去,直到最后一个人,那个人就可以自己决定自己的命运。这就是著名的约瑟夫问题。
那么怎样才能决定自己的命运呢?就是一开始41人时就要占据有利的位置。那么哪个位置是有利的位置? 不说了,直接上代码!
1 class Joseph { 2 public: 3 int getResult(int n, int m) { 4 vector<int> a(n); 5 int cur = 0; 6 int pre = n-1; 7 int count = 0; 8 int allPeopleCount = n; 9 int i;10 11 12 for(i = 0; i < n-1;i++){13 a[i] = i+1;14 }15 16 while(allPeopleCount){17 18 if(++count >= m)19 {20 allPeopleCount--;21 count = 0;22 a[pre] = a[cur]; //类似指针23 24 } 25 else26 pre = cur;27 cur = a[cur];28 }29 30 return cur+1;31 32 33 }34 };
此方法比较字节用数组模拟环形链表,在一个一个删除节点:
另一种方法就是找出递归的关系式我们已知递归的出口是getResult(1,m) = 1; m代表报到那个数字自杀的人
通过推到我们可以知道 getResult(i,m) = (getResult(i-1,m)+m-1)%i+1; 这是用递归就很简单了。
class Joseph {public: int getResult(int n, int m) { if(n == 1) return 1; return (getResult(n-1,m)+m-1)%n + 1; } };
0 0
- 约瑟夫问题、约瑟夫环
- Josephus约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题--java
- 约瑟夫环问题 Josephus
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 求解约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- javaScript初级逻辑运算或且真假命题
- C++学习之路-开篇
- Genymotion上不能安装APK软件的问题
- 游戏机厅的手舞足蹈跳舞机和E舞成名跳舞机多少钱一台?
- C语言基本数据类型
- 约瑟夫环问题
- Linux下的pure-ftp的安装详解
- PAT L3-010. 是否完全二叉搜索树
- arpa/inet.h所引起的Segmentation fault及网络编程常见的头文件
- ORACLE11g下如何利用SQL DEVELOPER连接上数据库?
- Linux环境下proc的配置c/c++操作数据库简单示例
- 一道题浅析 i++,++i,i+1及(引用)&i的区别
- Android之MediaProjection的简介
- 深度剖析fork()的原理及用法