java趣味算法(一)——约瑟夫问题
来源:互联网 发布:php面试官常问的问题 编辑:程序博客网 时间:2024/05/21 19:46
用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); }}
阅读全文
0 0
- java趣味算法(一)——约瑟夫问题
- 每天一算法——约瑟夫问题
- 趣味算法-约瑟夫环
- 约瑟夫问题JAVA算法
- 蓝桥杯——趣味整数问题一(2017.1.30)
- 蓝桥杯——趣味数组问题一(2017.2.5)
- 数据结构与算法Java版——约瑟夫环问题
- Java实现约瑟夫算法问题
- 【java算法】约瑟夫问题求解
- Java趣味编程(一)
- 【算法】算法中的趣味数学(一)
- 约瑟夫问题——算法优化
- 算法实现——约瑟夫问题
- 递归算法——约瑟夫问题
- 算法总结——约瑟夫问题
- 数据结构与算法——约瑟夫问题
- 趣味算法题——中国象棋将帅问题
- 趣味算法题——电梯调度问题
- Oracle 简单sql
- 小知识点
- [Lintcode] #452 删除链表中的元素
- Codeforces Round #443 (Div. 2) A. Borya's Diagnosis
- pgsql9.1 基于wal的完全恢复
- java趣味算法(一)——约瑟夫问题
- 2017.10.26模拟赛day1
- leetcode解题方案--023--Merge k Sorted Lists
- [论文笔记]Predicting Deeper into the Future of Semantic Segmentation
- Python print() 函数
- CSS中的塌陷问题总结
- 向操作系统申请内存的两种方式:brk和mmap
- Unity3d emission 的使用
- python基础-set、各个数据类型转换、深浅拷贝