约瑟夫圆环的C++实现
转载请注明出处:点我
昨天参加了企鹅的2015年实习生招聘的笔试,编程题第一道题就是约瑟夫圆环问题,要求用C++来实现。
约瑟夫圆环问题其实是一个很有名的问题:问题的描述为:
设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第k个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。
这个问题网上的解法很多,我的思路是这样的:
所有人排成一排,每次由站在(最左边)排头的人报数(如果不是由站在排头的人报数,比如由站在第n位的人报数,则把前面n-1个人按照次序放到队伍的最后面),如果站在排头的人不符合出圈的要求,就把排头的人出队列,并站到排尾,队列全部往前移动一个位置。再由排头的人报数,以此类推。
这里以7个人为例,从第3个人开始报数,报到3的出队列,下一个接着报,以count表示当前的报数:
以7个人为例,每个人的编号依次为1,2,...7,把7个人依次放在一个队列里面,如下图所示:

因为是从第三个人开始报数,所以要把第三个人前面的两个人按照先后次序放到排尾,结果如下图所示:

此时,序号为3的人位于排头,由他开始报数,报数count = 1,不符合出队列要求,所以把他出队列,牌都排尾,然后队伍整体向前移动一个位置,如下图所示:

此时由位于排头的序号为4的人进行报数,count = 2,也不符合要求,同样的出队列,放到排尾,

此时序号为5的人站在排头,报数count=3,符合要求,现在把序号为5的人出队列,并输出序号
此时第一轮报数完成,序号为5的人出队列,输出5,设置count=0,并开始下一轮报数

现在序号6位于排头,报数count=1,不符合要求,出队列,站在排尾
重复上面的过程,即可得到出队列的次序为:
5 1 4 2 6 3 7
下面是代码实现:
/*
* number个人围城一圈,从第start个人开始报数,
* 报到第k个数的人圈,下一个接着从头开始报数
* author:rio_2607
*/
void yuesefu(int number,int start,int k)
{
deque<int> queue;
//把number个人依次放入一个deque队列中去
for(int i = ;i <= number;++i)
queue.push_back(i);
int count = ;
while(count < start)
{
//只要还没有达到第start个人,就依次把最前面的元素放到最后面去
queue.push_back(queue.front());
queue.pop_front();
++count;
}
while(queue.size() != )
{
int step = ;
while(step < k)
{
//只要还没有报数报到第k个就把当前的元素放到queue的最后面去
queue.push_back(queue.front());
queue.pop_front();
++step;
} //数到了第k个,把第k个删除
cout << queue.front() << " ";
queue.pop_front();
}
}
因为要频繁的在队列的头部和尾部插入数据,删除数据,所以选择用STL中的deque容器来实现。
下面是测试程序:7个人,从第三个人开始报数,报道3的人出队列:
int main()
{
int start = ,step = ;
int number = ;
yuesefu(number,start,step);
return ;
}
得到的输出结果是:

约瑟夫圆环的C++实现的更多相关文章
- 51nod 1074 约瑟夫环 V2
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. ...
- css3圆环百分比,菜单栏定位导航
前段时间,社区个人中心改版,看了下设计图,当时隐约感觉到有两个地方(圆环百分比,菜单栏定位导航)比较麻烦.设计图大致如下: 首先看圆环百分比,网上的做法大致分两种,一种是用了CSS3中的transfo ...
- Android自定义View之圆环交替 等待效果
学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...
- 约瑟夫问题(java实现)
方法一.自定义的链表实现 package com.code.yuesefu; public class YueSeFuList { public static void main(String[] a ...
- Java 解决约瑟夫问题
约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称“丢手绢问题”.) 有这样一个故事,15个教徒和15个非教徒在深海遇险必须讲 ...
- 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
[BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...
- C#实现约瑟夫环问题
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace orde ...
- C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...
- C语言链表实现约瑟夫环问题
需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...
随机推荐
- 镜头覆盖范围FOV 的规划与FOV去四角
本文纲要: 规划FOV的原因 FOV去四角 简单的声明 FOV查找思路 查找FOV的代码 TNoFourCornersRect结构及Contains函数 判断两个矩形是否相交 延伸与拓展 本文内容: ...
- leetcode:ZigZag Conversion 曲线转换
Question: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of ...
- R command
setwd("D:/Research/code/rcode") #notice the "/" list.files(getwd()) heisenber ...
- java 抽象类和接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念 ...
- win+r 快速启动应用程序
如何使用WIN+R快捷键快速启动应用程序呢?其实很简单 首先随便在一个盘上建一个新文件夹,随便取什么名字,最好是英文格式,小编以D盘为例,如图 2. 打开文件夹,单击右键,选择“新建”,单击“快捷方式 ...
- MoveTo和MoveBy
cc.MoveTo是“移动到这里",而cc.MoveBy则是“相对于之前点再移动”,通俗一点就是说这里需要两个坐标pos1(x1,y1),pos2(x2,y2). 如果是cc.MoveTo的 ...
- SQL Server UDF用户自定义函数
UDF的定义 和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且尅作为一个单元爱进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数, ...
- 关于在II7里面出现:当前信任级别设置不支持调试 的解决方法
问题得到解决,把查到的方案贴出来: 在windows server 2008里面做网站,遇到当前信任级别设置不支持调试. 这个问题,在网上找了不少,但是没有关于IIS7 的. 突然想起来IIS7里面A ...
- C# Common Keyword
[C# Common Keyword] 1.abstract Use the abstract modifier in a class declaration to indicate that a c ...
- PCB中层的定义(一)