约瑟夫杀人游戏

来源:互联网 发布:淘宝购物车怎么付款 编辑:程序博客网 时间:2024/06/16 02:21

据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
现在我们求的是n个人,数到5的被枪毙,最后活下来一个人

public class jsoeplus {    public static int N = 20;    public static int M = 5;//数到M就咔擦一个人    class Node{        int val;//下标        Node next;        public Node(int val){            this.val = val;        }    }    public void killNode(){        Node header = new Node(1);//第一个结点        Node x = header;//目前被点到人        for(int i = 2;i<=N;i++){            x=(x.next = new Node(i));        }        x.next = header;//头尾相接        System.out.println("被咔擦的顺序为:");        while(x!=x.next){            //至少还有俩人,仍然继续报数,咔嚓            for(int i = 1;i<M;i++){                x = x.next;            }            System.out.println(x.next.val+"被干掉 ");            x.next = x.next.next;        }        System.out.println("最后这个幸运儿是:"+x.val);    }    public static void main(String[] args){        jsoeplus jsoeplus = new jsoeplus();        josephus.killNode();    }}

结果:

被咔擦的顺序为:
5被干掉
10被干掉
15被干掉
20被干掉
6被干掉
12被干掉
18被干掉
4被干掉
13被干掉
1被干掉
9被干掉
19被干掉
11被干掉
3被干掉
17被干掉
16被干掉
2被干掉
8被干掉
14被干掉
最后这个幸运儿是:7