package yuesefu;

/**
 * 约瑟夫问题解法
 * 使用递归算法
 * 2018年5月19日 冯超华
 * 
 * 结果:如果mensCNT=41,则结果=15,30(基于从0开始,如果是从1算起,则为16,31)
 */
public class Yuesefu {

java.util.List<Integer> mens = new java.util.ArrayList<Integer>(); //人员列表,为适应java习惯,用0~40来表示这41个人

private static final Integer mensCNT = 41; //人数,可以尝试修改为其他数字

/**
* 构造函数,将mens填充,用0-40来代表这41个人,或者其他数量的人
*/
public Yuesefu() {
//人的编号为0-40
for(Integer i = 0; i < mensCNT; i ++) {
mens.add(i);
}
}

private int now = 1; //当前数的数,从1 i开始,数到3的人自杀
private int position = 0; //当前数数那个人的位置,用来标记让哪个位置的人自杀

/**
* 递归执行,计算下一个该自杀的人并从list里删除他
*/
public void killNext() {
if(mens.size() <= 2) { //如果只剩不超过2个人了,则停止(实际上就是剩下2人的时候停止)//如果没有这一段,会死循环
System.out.println("幸存者(从0开始):" + mens.toString() + ",若是从1开始的话,每个数字加1");
return;
}

if(position >= mens.size()) { //如果当钱数数那个人超过了队伍里的最后一个,从回到队伍的开头,实际上就是让这个队伍排成圆圈
position = 0;
}

System.out.println("当前position:" + position + ",当前幸存者:" + mens.toString() + ",剩余人数:" + mens.size());

if(now < 3) { //数数时如果不是3的,就跳过
position ++; //位置后移
now ++; //数字下一个
}else {
System.out.println("自杀:" + mens.remove(position)); //如果数到3,则自杀----在这里就是从list里移除它//remove(Integer)操作会返回被移除的那个对象,所以这里不需要用get(Integer)
//position --; //这里不需要--,虽然少了一个人,但是下一个人补上来了,这个人会数1,但是他的位置position就是刚刚自杀掉的那个倒霉蛋的位置
now = 1; //数数重新开始
}
killNext();
}

public static void main(String[] args) {
new Yuesefu().killNext();
}

}

练习:约瑟夫问题解法相关推荐

  1. 约瑟夫环解法大全(C语言版)

    前言: 约瑟夫环不愧是一道经典的算法题,原来也经常看到,但一直没有动手编码研究.最近又被同学提起这个问题,就研究了一下,发现这个问题可以挖掘的东西有很多,怪不得一直是面试的热门问题. 解法一,使用链表 ...

  2. 映射递归循环-约瑟夫环问题递归解法的一点理解

    先说明一点,如果有什么不对的地方,欢迎大家批评指正. 先来看这个类型的某个题目描述: 约瑟夫生者死者游戏 约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载, 加上风浪大作,危险万分.因此船长告诉乘 ...

  3. 剑指Offer(java答案)

    剑指Offer(java答案) 剑指Offerjava答案 3二维数组中的查找 4替换空格 5从尾到头打印链表 6重建二叉树 7用两个栈实现队列 8旋转数组的最小数字 9斐波那契数列 扩展1跳台阶 扩 ...

  4. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  5. 约瑟夫斯问题-java版数组解法和链表解法

    10个人围成一圈,从1到10编号,从1开始数,数到3或3的倍数的位置,则该位置的人出局,求最后剩下哪一个号? 数组解法: 数组存放数组:a[10]存在1到10编号人 数组遍历到尾部又从头遍历:遍历数组 ...

  6. 求约瑟夫环问题最后胜利者的一般解法以及数学推导方法

    问题描述: 约瑟夫环问题(Josephus) 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序. 解法一: 思路:建立一个有N个元素的循环链表,然后从链表表头遍 ...

  7. 约瑟夫问题的解法集锦

    约瑟夫问题的N种解法 1 问题的历史以及不同的版本号 1.1  约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他參加并记录了公元66-70年犹太人反抗罗马的起义. ...

  8. 这样给面试官解释约瑟夫环问题的几种巧妙解法,面试官满意的笑了

    转载请联系公众号:bigsai 前言 约瑟夫环问题是算法中相当经典的一个问题,其问题理解是相当容易的,并且问题描述有非常多的版本,并且约瑟夫环问题还有很多变形,这篇约瑟夫问题的讲解,一定可以带你理解通 ...

  9. 简单约瑟夫环问题解法汇总(模拟/数论)

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

最新文章

  1. 微软VS.NET(visual studio.net)中FreeTextBox控件的详细使用视频教程
  2. mycncart 1.4.0.0 新版本发布
  3. 分布式单点登录框架XXL-SSO
  4. ssh中c3p0连接mysql_ssh 中使用c3p0 的连接池配置 | 学步园
  5. python使用ssh 中文_Python3制作简易SSH登录工具
  6. 进程之 回收子进程之避免僵尸进程的产生
  7. 一个农民工学习LINUX内核的艰辛历程/嵌入式的感受
  8. 神经网络常用激活函数总结
  9. idea使用jrebel热部署插件
  10. wps文档怎么画流程图6_wps文字如何绘制流程图图文教程
  11. 直角三角形用计算机怎么做,‎App Store 上的“直角三角形计算器”
  12. 河南城建学院的计算机科学与技术,河南城建学院计算机科学与工程系
  13. HBuilderX 打包 vue 项目生成 apk
  14. 数学物理方法 数学物理方程
  15. Learning to Track at 100 FPS with Deep Regression Networks全文翻译
  16. 扇贝一面----Android面经
  17. Python基础知识详解 从入门到精通(八)魔法方法
  18. 昆明第十二中学计算机笔试题目,昆明市第十二中学2015年招考笔试、面试、课堂考核安排公告...
  19. [Unfinished] 28_α = β_Direct_Current_Non_Loop_Curren
  20. Android Studio开发蓝牙应用(二)

热门文章

  1. 安卓开发知识点!这些Android高级必会知识点你能答出来几个?系列篇
  2. SAP R/3系统技术
  3. 银弹谷V-DevSuite部署构件时提示无法连接到远程服务器
  4. 《中华大字库2012》注意事项
  5. 智能车间如何无人化?APS系统来帮忙
  6. 我在京东做研发丨京东物流仓储效率提升AI算法大揭秘
  7. 怎样在word中添加字体
  8. Python教程分享,10款超好用的Python开发工具!
  9. TI DSP TMS320C66x学习笔记之SPI Nor Flash多核程序烧写
  10. 如何在微信小程序中配置输入必填报错?