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);    }}
原创粉丝点击