约瑟夫问题由来

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了人数总和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行,直到仅余15个人为止。问怎样的排法,才能使每次投入大海的都是非教徒。

约瑟夫问题算法思想

由于用到四种不同的存储结构,它们的算法思想依次是:

  1. 首先建立一个顺序表模拟整个约瑟夫环,手动输入顺序表长(即参加约瑟夫循环的人数)和循环的次数和表元素。用已经输出总人数和顺序表长作比较,作为外层循环条件。并对每一个输出后的元素重新赋值以为标记。对于每次循环,首先检查顺序表此次是不是我们设立的标记,如果不是则循环次数加1,当达到要求的循环次数时就将循环次数设置为0,输出该元素到屏幕并将总输出元素加1。每次外循环我们都会移到表的下一个位置,作为新的判断条件,每次报到表尾的时候,我们都将重新设置到表尾,作为下次循环的表元素。
  2. 首先采用链式循环链表建立整个约瑟夫环,手动输入第一次的循环次数和每个人所持下一个循环次数。设立判断指针指向表头,并将该指针是否为空作为外层循环条件。做一个内层循环,将判断指针移动到循环要输出的数,并设立一个前指针指向该指针的前一个位置,输出该元素后,将循环次数重新赋值成该元素。接着判断前指针和判断指针比较,如果相等说明整个表已经输出完毕,否则将删除该位置的元素。
  3. 用链式队列建立循环约瑟夫环,手动输入人数,第一次的循环次数和每个人所持下一个循环次数。并将每一个元素依次加入队列,根据第一次循环次数,建立一个for循环,每一次循环都能出队列,如果达到要求的循环次数就输出,否则进队列,这样这个数字就出现在队尾。第一个数输出后,以队列的非空作为循环条件,判断方式如上。
  4. 用循环队列建立约瑟夫环,将1-7个元素依次进入队列,以队列的长度作为与已输出的元素作为判断条件,对每一个输出后的元素重新赋值以为标记。对于每次循环,首先检查该位置元素是不是我们设立的标记-1,如果不是则循环次数加1,将队首指针移到队列的下一个元素,结束此次循环,当达到要求的循环次数时就将重新循环次数设置为0,输出该元素到屏幕并将总输出元素加1.

问题分析与算法设计

约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。

题目中30个人围成一圈,因而启发我们用一个循环的链来表示,可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。这样循环计数直到有15个人被扔下海为止。

问题示例

设编号分别为:1,2,...,n的n个人围坐一圈。约定序号为k(1 <= k < = n)的人从1开始计数,数到m的那个人出列,他的下一位又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止;

设n=8,k=3,m=4时:

出列为:6,2,7,4,3,5,1,8

算法思路:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后从第k结点起从1计数,计到m时,对应结点从链表中删除;然后再从被删除结点的下一个结点起又从1开始计数....,直到所有结点都列出时算法结束。

代码实现:

围成一圈的排列组合问题_约瑟夫问题相关推荐

  1. 围成一圈的排列组合问题_分班必考知识点!小学奥数之排列组合问题

    点击上方蓝字关注我们 查看更多知识点哦~ SH  研习社 往期精彩回顾 分班必考知识点!小学奥数之流水行船问题 分班必考知识点!小学奥数之牛吃草问题 分班必考知识点!小学奥数之巧算分数 分班必考知识点 ...

  2. 围成一圈的排列组合问题_行测技巧:巧解环形排列组合

    各位同学,排列组合是行测考试中的一个高频考点,也是我们学习的难点.排列组合中有一种特殊的模型---环形排列组合,那么今天小编就带大家一起来探讨一下:如何求解环形排列组合问题. 首先我们需要明确,什么是 ...

  3. 围成一圈的排列组合问题_行测技巧:排列组合之“环形排列”问题

    原标题:行测技巧:排列组合之"环形排列"问题 在公考学习备考中排列组合一直是大家比较头疼的题目,很多同学在高中时就对这种题目望而却步,其实排列组合题目虽然比较难,但是这类题目却可以 ...

  4. 约瑟夫问题-N个人围成一圈循环杀掉第M个人

    约瑟夫问题-N个人围成一圈循环杀掉第M个人 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报.如此反复,最后剩下一个,求最后的胜利者. 例如只有三 ...

  5. c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题 N个人围成一圈 - phpStudy...

    详解约瑟夫环问题及其相关的C语言算法实现 约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推 ...

  6. 【生存游戏】一组按序排列围成一圈的参赛选手,通过逢3退1游戏机制筛选出最后一个生存者的Java算法

    游戏背景 私立希望之峰学园是一座集结了所有领域的超一流高中生的学校.主人公苗木诚,本来只是一名很平凡的日本高中生,却在无意中被选为了"超高校级的幸运"者进入了学园.但是,等待他的却 ...

  7. (python)约瑟夫(Josephus)个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿

    约瑟夫(Josephus)环问题 题目:n个人围成一圈,并按顺时针依次编号1-n.从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿 ...

  8. 题目: 有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。(模拟)

    题目: 有 n个人围成一圈,顺序排号.从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位. 思路: 题目说是排成一圈,可以看成一个数组的排列.用i从下标为 ...

  9. ACMNO.38 C语言-报数 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

    题目描述 有n人围成一圈,顺序排号. 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.`在这里插入代码片` 问最后留下的是原来的第几号的那位. 输入 初始人数n 输出 最后一人的初始编号 样 ...

最新文章

  1. 传送门(portal)
  2. Java设计模式之行为型:迭代器模式
  3. [转]纯脚本写的仿照cmd命令窗口
  4. 如何找到Angular应用的某个directive是属于哪一个Angular module
  5. 无法在WEB服务器上启动调试,Web 服务器配置不正确 解决
  6. VSCode调试Python时终端输出中文乱码解决方法2
  7. ANDROID常用的命令(转载,后续自己完善)
  8. 电脑仙人掌机器人作文_暑假有空来练笔——2019各地小学期末作文题目集锦
  9. 甲骨文超 IBM 成全球第二大软件公司
  10. 360搜索核心算法,被K后如何恢复?
  11. win10+ubuntu16双系统卸载流程及问题总结
  12. 电脑死机,Word忘了保存怎么恢复?(编辑器是WPS)
  13. 高德地图怎么测量面积_高德地图如何测量海拔
  14. 02 shell编程之条件语句
  15. (转)TensorFlow--实现人脸识别实验精讲 (Face Recognition using Tensorflow)
  16. 如何判断代理IP是高匿
  17. 基于BP神经网络改进的DSS工具箱盲源分离系统
  18. asp行驶证识别,驾驶证识别api代码demo示例,还可以识别车牌
  19. windows下补丁手动下载和安装
  20. 2017 计蒜之道 初赛 第一场 阿里的新游戏 题解

热门文章

  1. 波卡链Substrate (7)Babe协议六“Secondary slot leader”
  2. C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间
  3. C++(十)——模板(上)
  4. 操作系统课设--使用信号量解决生产者/消费者同步问题
  5. [TT]-Trustonic acronyms
  6. [mmu/cache]-MMU的寄存器学习
  7. shellcode模板(使用hash获取API)
  8. 由PLC未授权访问引发的工程重置漏洞
  9. Sophos将AI技术用于预防恶意IP的安全解决方案中
  10. PE学习(一)masm32开发环境和ollyICE使用