约瑟夫环(Josehpuse)的模拟
约瑟夫环问题:
0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。
这里给出以下几种解法,
1.用队列模拟
每次将前m-1个元素出队,出队元素放入队列的末尾,再循环即可,这种方法时间复杂度为O(mn)(每找出一个数字需要m步运算,要找出n人数字),空间复杂度为O(n),用于存放队列,运行结果如下。

2.环形链表模
时间复杂度为O(mn),空间复杂度为O(n)
代码如下(vs2015调试正常):
//Josephuse环问题
#include <iostream>
#include <cstdlib>
#include <queue>
#include <vector>
#include <list> using namespace std; //用队列模拟
void Q_Joes(int n, int m)
{
queue<int> Q;
vector<int> result;
for (int i = ; i < n; i++) {
Q.push(i);
}
int count = m;
while (!Q.empty()) {
while (--count) {
Q.push(Q.front());
Q.pop();
}
result.push_back(Q.front());
Q.pop();
count = m;
}
for (auto i : result)
cout << i << " ";
cout << endl;
cout << result[result.size() - ];
cout << endl;
} //用循环链表来模拟,当单链表迭代器到末尾时,将其移到链表的开头,以此来模拟一个环形链表
void List_Joes(int n, int m)
{
if (n < || m < )
return;
list<int> L;
vector<int> result;
int i;
for (i = ; i < n; ++i)
L.push_back(i);
list<int>::iterator curNode = L.begin();
while (L.size() > ) {
//找到第m个数字
for (int i = ; i < m; ++i) {
curNode++;
if (curNode == L.end())
curNode = L.begin();
} auto next = ++curNode;
if (next == L.end())
next = L.begin();
--curNode;
result.push_back(*curNode);
L.erase(curNode);
curNode = next; }
for (auto i : result)
cout << i << " ";
cout << endl;
cout << result[result.size() - ];
cout << endl;
} int main()
{
int n, m;
cin >> n >> m;
Q_Joes(n, m);
List_Joes(n, m);
system("pause");
return ;
}
3.数学解法
当n为1时,最后剩下的数字为0
当n大于1时,f(n,m) = f'(n -1,m) = (f(n -1,m) + m) %n
#include <stdio.h>
#include <stdlib.h> int main()
{
int n, m,i,last;
scanf("%d%d", &n, &m);
last = ;
for (i = ; i <= n; i++)
last = (last + m) % i;
printf("%d\n", last);
system("pause");
return ;
}
约瑟夫环(Josehpuse)的模拟的更多相关文章
- Roman Roulette(约瑟夫环模拟)
Roman Roulette Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu 4841 圆桌问题(用vector模拟约瑟夫环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4841 圆桌问题 Time Limit: 3000/1000 MS (Java/Others) M ...
- tc 147 2 PeopleCircle(再见约瑟夫环)
SRM 147 2 600PeopleCircle Problem Statement There are numMales males and numFemales females arranged ...
- 14.约瑟夫环问题[JosephusProblem]
[题目] n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后,从被删除数字的下一个继续删除 ...
- Java学习之约瑟夫环的两中处理方法
package day_2; import java.util.Scanner; /** * @author Administrator * 约瑟夫环问题: 设编号为 1,2,3,....n的N个人围 ...
- 约瑟夫环问题及python与c++实现效率对比
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重 ...
- UVA 305 Joseph (约瑟夫环 打表)
Joseph The Joseph's problem is notoriously known. For those who are not familiar with the original ...
- 【剑指offer】约瑟夫环问题
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27957407 题目描写叙述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小 ...
- POJ 2359 Questions(约瑟夫环——数学解法)
题目链接: http://poj.org/problem?id=2359 题意描述: 输入一个字符串 按照下面的规则,如果剩下的最后一个字符是'?',输出"Yes",如果剩下的最后 ...
随机推荐
- 【BZOJ】2719 银河之星
可以将棋子分为9种类型.且可以通过合并使得两个不同种类棋子转换为另一种棋子(不过要注意棋盘大小,有的时候硬要合并会到棋盘外面,可以先把棋盘全部转换,然后枚举每一个棋子的转换).然后把状态压成一个十位的 ...
- hdu 4635 Strongly connected
http://acm.hdu.edu.cn/showproblem.php?pid=4635 我们把缩点后的新图(实际编码中可以不建新图 只是为了概念上好理解)中的每一个点都赋一个值 表示是由多少个点 ...
- yii2-user
https://github.com/dektrium/yii2-user 安装 : composer require "dektrium/yii2-user:0.9.*@dev" ...
- sql float 转换为 nvarchar
INSERT INTO CC11 SELECT convert(nvarchar(30),convert(decimal(11,0),PCTID)),convert(nvarchar(30),conv ...
- 1-5Tomcat 目录结构 和 web项目目录结构
对应我的安装路径: web项目目录结构
- Linux摄像头驱动学习之:(四)UVC-摄像头驱动框架分析
UVC: USB Video ClassUVC驱动:drivers\media\video\uvc\ uvc_driver.c分析:1. usb_register(&uvc_driver.dr ...
- Http协议访问DataSnap Rest 服务器
用TIDHttp访问DataSnap Rest服务器,在服务器采用了用户验证的情况下,客户端需要注意下面的细节,否则不能正常连接. 假如服务器有如下的用户验证: procedure TSC.DSAut ...
- Photo Kit 框架
http://geek.csdn.net/news/detail/56031 http://www.jianshu.com/p/9988303b2429 http://blog.sina.com.cn ...
- 球形环境映射之angular方式的两种形式
图形学中,某些物体带有反射属性,会反射周围的环境.一种做法是沿着反射方向发一条光线,与场景求交,获取到交点的颜色值,作为反射的颜色.显然这种方法比较低效,更高效的方法是将被渲染物体所处的环境保存到一张 ...
- javascript之小积累-.-添加form表单查询的enter键支持
/* * 列表查询的enter键支持 * author by 清风 */ function enterEvent() { document.onkeydown = function(even ...