转载请注明出处:点我

昨天参加了企鹅的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++实现的更多相关文章

  1. 51nod 1074 约瑟夫环 V2

    N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. ...

  2. css3圆环百分比,菜单栏定位导航

    前段时间,社区个人中心改版,看了下设计图,当时隐约感觉到有两个地方(圆环百分比,菜单栏定位导航)比较麻烦.设计图大致如下: 首先看圆环百分比,网上的做法大致分两种,一种是用了CSS3中的transfo ...

  3. Android自定义View之圆环交替 等待效果

    学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...

  4. 约瑟夫问题(java实现)

    方法一.自定义的链表实现 package com.code.yuesefu; public class YueSeFuList { public static void main(String[] a ...

  5. Java 解决约瑟夫问题

    约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称“丢手绢问题”.) 有这样一个故事,15个教徒和15个非教徒在深海遇险必须讲 ...

  6. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  7. C#实现约瑟夫环问题

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace orde ...

  8. C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

    尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...

  9. C语言链表实现约瑟夫环问题

    需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...

随机推荐

  1. loadrunner之C语言编程

    一.常量定义 #define COUNT 100            //定义全局常量#define SALARY 4000 Action(){    int total;    total = C ...

  2. Linux基本命令(8)网络操作的命令

    网络操作命令 命令 功能 命令 功能 ftp 传送文件 telnet 远端登陆 bye 结束连线并结束程序 rlogin 远端登入 ping 检测主机 netstat 显示网络状态 8.1 ftp命令 ...

  3. Monitor traffic to localhost from IE or .NET

    原文:http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/MonitorLocalTraffic Monitor traffic to lo ...

  4. Thrift框架介绍

    1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和 ...

  5. SQL时间第二期_时间格式化

    0   或   100   (*)     默认值   mon   dd   yyyy   hh:miAM(或   PM)       1   101   美国   mm/dd/yyyy       ...

  6. dom 表格操作

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. NativeInt

    NativeInt ni = 100; //Wrong. Will issue an Error NativeInt ni = NativeInt(100); //Correct System::Ge ...

  8. Unity3D Script KeynoteII

    [Unity3D Script KeynoteII] 1.使用代码操作Particle. //粒子对象 GameObject particle = null; //粒子X轴方向速度 float vel ...

  9. Maven Archetype Plugin

    使用Archetype的一般步骤 命令——mvn archetype:generate 输入命令后,Archetype插件会输出一个Archetype列表供用户选择:选择自己想要使用的Archetyp ...

  10. 如何在Html的CSS中去除<li>标签前面小黑点,和ul、LI部分属性方法

    div是很多人做网站都会用到的,但在显示效果时前面总是会有一个小黑点,这个效果很多人不想要,但又不知到如何去除,然而我们可以用以下方法来清除. 1.在CSS中写入代码.找到相关性的CSS,在..li和 ...