首先看一下算法背景:
罗马人攻占了乔塔帕特,41人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家josephus和他的一个朋友。剩余的39个人为了表示不向罗马人屈服,决定集体自杀。大家决定了一个自杀方案,所有这41人围城一个圆圈,由第一个人开始顺时针报数,没报数为3的人就立刻自杀,然后由下一个人重新开始报数任然是每报数为3的人就立刻自杀,......,知道所有人都自杀死亡为止. public class yuesefu { /** * 构建循环链表 * @param totalCol * @return */ public node createNodes(int totalCol){ node head = null; node[] nodes = new node[totalCol]; for(int i = 0 ; i < totalCol ; i++){ nodes[i] = new node(); nodes[i].node = i+1 ; if(i==0){ head = nodes[i]; }else{ nodes[i-1].next = nodes[i]; } } nodes[totalCol-1].next = head ; return head ; } public void begin(int total){ int sort = 0 ; int n = total ; int m = 3 ; m %= n ; node head = createNodes(total); //判断循环链表是不是只剩下一个节点 while(head.next != head){ for(int i = 1 ; i < m-1 ; i++){ head = head.next; } node temp = head.next; System.out.println("第"+(++sort)+"个自杀的为:"+temp.node); head.next = temp.next; head = head.next; } System.out.println("第"+(++sort)+"个自杀的为:"+head.node); } public static void main(String[] args) { yuesefu y = new yuesefu(); y.begin(41); } } class node { node next ; int node ; public node getNext() { return next; } public void setNext(node next) { this.next = next; } public int getNode() { return node; } public void setNode(int node) { this.node = node; } }
