问题:人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,处刑下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。
翻译过来就是,编号1…n的n个人围成一个环,约定编号为k的人开始报数,数到m的人出列,他的下一位又开始从1报数…以此类推。输出出队编号。
(设定1<= k <=m)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| package com.youdef.DataStructure.linkedlist;
public class JosephuCircle { public static void main(String[] args) { CircleSingleLinkedList csl = new CircleSingleLinkedList();
csl.addBoy(14); csl.showBoy();
csl.countBoy(10,7, 14); } }
class CircleSingleLinkedList { private Boy first = null;
public void addBoy(int nums){ if (nums < 1){ System.out.println("nums数值不正确"); return; } Boy curBoy = null; for (int i=1; i<=nums; i++){ Boy boy = new Boy(i); if (i==1){ first = boy; first.setNext(first); curBoy = first; }else { curBoy.setNext(boy); boy.setNext(first); curBoy = boy; } } }
public void showBoy(){ if (first == null){ System.out.println("没有任何~~."); return; } Boy curBody = first; while (true){ System.out.printf("小孩编号 %d \n",curBody.getNo()); if (curBody.getNext() == first){ break; } curBody = curBody.getNext(); } }
public void countBoy(int startNo, int countNum, int nums){ if (first == null || startNo < 1 || startNo > nums){ System.out.println("参数输入有误,请重新输入."); return; } Boy helper = first; while (true){ if (helper.getNext() == first) break; helper = helper.getNext(); } for (int i=0; i<startNo-1; i++){ first = first.getNext(); helper = helper.getNext(); } while (true){ if (helper == first){ break; } for (int i=0; i<countNum-1; i++){ first = first.getNext(); helper = helper.getNext(); } System.out.printf("小孩%d出圈\t",first.getNo()); first = first.getNext(); helper.setNext(first); } System.out.printf("最后一个小孩 %d\n",first.getNo());
} }
class Boy { private int no; private Boy next;
public Boy(int no){ this.no = no; }
public int getNo(){ return no; } public void setNo(int no){ this.no = no; } public Boy getNext(){ return this.next; } public void setNext(Boy next){ this.next = next; } }
|
最终打印:
1 2
| 小孩2出圈 小孩9出圈 小孩3出圈 小孩11出圈 小孩6出圈 小孩1出圈 小孩13出圈 小孩12出圈 小孩14出圈 小孩5出圈 小孩10出圈 小孩4出圈 小孩7出圈 最后一个小孩 8
|