约瑟夫环问题:

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)的模拟的更多相关文章

  1. Roman Roulette(约瑟夫环模拟)

    Roman Roulette Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. hdu 4841 圆桌问题(用vector模拟约瑟夫环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4841 圆桌问题 Time Limit: 3000/1000 MS (Java/Others)    M ...

  3. tc 147 2 PeopleCircle(再见约瑟夫环)

    SRM 147 2 600PeopleCircle Problem Statement There are numMales males and numFemales females arranged ...

  4. 14.约瑟夫环问题[JosephusProblem]

    [题目] n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后,从被删除数字的下一个继续删除 ...

  5. Java学习之约瑟夫环的两中处理方法

    package day_2; import java.util.Scanner; /** * @author Administrator * 约瑟夫环问题: 设编号为 1,2,3,....n的N个人围 ...

  6. 约瑟夫环问题及python与c++实现效率对比

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重 ...

  7. UVA 305 Joseph (约瑟夫环 打表)

     Joseph  The Joseph's problem is notoriously known. For those who are not familiar with the original ...

  8. 【剑指offer】约瑟夫环问题

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27957407 题目描写叙述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小 ...

  9. POJ 2359 Questions(约瑟夫环——数学解法)

    题目链接: http://poj.org/problem?id=2359 题意描述: 输入一个字符串 按照下面的规则,如果剩下的最后一个字符是'?',输出"Yes",如果剩下的最后 ...

随机推荐

  1. 【html5】常见标签使用说明(持续更新)

    说明: 所谓常见,是指我在优秀网页源码中见到的. 1.viewport 我见到的时候是这样: <meta name="viewport" content="widt ...

  2. 怎么改变 placeholder字体颜色

    ::-webkit-input-placeholder{color: #888}::-moz-placeholder{color: #888}:-moz-placeholder{color: #888 ...

  3. flash透明效果代码分享~~~

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...

  4. Android 之 log

    android.util.Log常用方法: Log.v()  VERBOSE  任何消息都会输出 Log.d()  DEBUG  仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DD ...

  5. 【BZOJ】2719 银河之星

    可以将棋子分为9种类型.且可以通过合并使得两个不同种类棋子转换为另一种棋子(不过要注意棋盘大小,有的时候硬要合并会到棋盘外面,可以先把棋盘全部转换,然后枚举每一个棋子的转换).然后把状态压成一个十位的 ...

  6. asp.net还原备份数据库(C#)

    因为做项目的时候用到对数据库的还原和备份,第一次接触,所以上网查了关于这方面的资料,网络果然是个好东西,该有的都有了,这里我就把原文中的代码直接粘贴过来了. using System; using S ...

  7. cocos2d-x 系列文章介绍

    学习 cocos2d-x 一年多,从3.0bata 到 现在的 3.6 ,从最早没什么教程到现在官网繁多的资料教程,  cocos2d-x  的变化实在是大.刚开始学习 cocos2d-x 是到处找资 ...

  8. 将excel2003文档文件转换为excel2007格式

    在sharepoint 2010 中,excel2007或excel 2010文档格式,支持web app 应用,能够在浏览器在线打开,查看,但excel 2003格式的文档只能用office客户端打 ...

  9. url编码 中文在url参数中传递,在请求头,响应头中传递,是如何编码的呢?

    一定要编码成url的吗?还是url自动把接受的汉字编码,请求头响应头到达之后再自动编码成汉字?这样似乎比较合理哦 先把iso8859-1 转换成 utf-8,在mvc中处理,然后响应的时候在转成iso ...

  10. C++异常处理的问题

    一般在C语言中,是通过返回值或者设置errno的方式来标识错误的 但在C++里面,构造函数是没有返回值的,于是发明了异常的方式:为了正确的向使用者表明 异常抛出的原因,你必须弄清楚异常抛出的原因(比如 ...