java趣味算法(一)——约瑟夫问题
2017-10-27 13:16
501 查看
用java实现约瑟夫问题
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。下面的代码实现从M个人中每次数N次,每次死一个人,然后从下一个人开始数N次,直到留下最后一个人
import java.util.ArrayList; import java.util.List; /** * 丢手绢,丢炸弹游戏, ( 约瑟夫问题 ) * 规则:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。 * Created by wangzhi on 2017/10/27 0027. */ public class Algorithm { /** * 炸弹丢到哪个位置 * @param sum 总人数 * @param interval 从第一个开始数 * @return */ public static int quyu(int sum, int interval){ if(sum < interval){ interval = interval % sum; } if(interval == 0){ return sum; } return interval; } /** * 初始化人数 * @param sum * @return */ public static List init(int sum){ List list = new ArrayList(); for(int i=0;i<sum;i++){ list.add((i+1)+"号"); } for(int i=0;i<sum;i++){ System.out.println("初始化:我是"+list.get(i)); } System.out.println("游戏开始!!"); return list; } /** * 移除被炸死的那个人 * @param list * @param point */ public static void removeHanderkerchief(List list,int point){ System.out.print("当前人数:"+list.size()+".刚才炸弹传递到第"+point+"个人,"+list.get(point-1)+"不幸被炸死"); list.remove(point-1); System.out.println("。。。。。。收尸完毕。剩余人数:"+list.size()); } /** * 重置数组 * @param oldList * @param point * @return */ public static List resetList(List oldList,int point){ List list = new ArrayList(); for(int i = point;i < oldList.size(); i++){ list.add(oldList.get(i)); } for(int i = 0 ; i < point;i++){ list.add(oldList.get(i)); } return list; } /** * 游戏开始 * @param size * @param interval */ public static void handkerchief(int size, int interval){ if(size<1){ System.out.println("人数至少2人以上才能进行游戏。。。"); return; } List list = init(size); int count = size; int i =1; while(list.size()>1){ System.out.println("第"+i+"回合开始。。。"); int point = quyu(count,interval); removeHanderkerchief(list,point); list = resetList(list,point-1); System.out.println("炸弹从"+list.get(0)+"开始数"); i++; count--; System.out.println(""); } System.out.println("*******************************************"); System.out.println("恭喜"+list.get(0)+"赢得游戏,获得炸弹人称号!!"); } public static void main(String[] args) { handkerchief(120,2); } }
相关文章推荐
- java-趣味算法
- 趣味算法——青蛙过河(JAVA)
- 利用高级Java、算法、三角学、分布计算设计自己的智能机器人
- 几种常见算法的JAVA实现
- 40道Java初中级算法面试题
- Java简单的加密解密算法,使用异或运算
- 用java编写的单源最短路径算法,Dijkstra算法
- Java内存回收算法
- 算法入门---java语言实现的二分查找小结
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- [Java基础要义] Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?
- Java 算法基础 -递归
- 算法笔记_031:计算中值和选择问题(Java)
- JAVA经典算法40题(1-20)
- 算法之 排序算法 (一) Java
- Java实现排序算法之冒泡排序
- 【LeetCode-面试算法经典-Java实现】【172-Factorial Trailing Zeroes(阶乘尾后0的数目)】
- 【密码学】DES加解密原理及其Java实现算法
- 操作系统进程调度算法(Java 实现)
- Java实现通用组合算法