Josephus问题:古代某法官要判决number个犯人的死刑,他有一条荒唐的法律:让囚犯站成一个圆圈,从第start个人开始数起,每数到第distance个犯人,就拉出去处决,然后再次数distance个人,再次进行处决,,,,直到最后只剩一个人,这个人会被赦免,当number = 5,start = 0,distance = 3时,过程如下:
代码如下:
package list; public class Josephus { public Josephus(int number, int start, int distance) { System.out.println("Josephus(" + number + "," + start + "," + distance + ")"); SeqList<String> list = new SeqList<String>(number); for (int i = 0; i < number; i++) { list.insert((char) ('A' + i) + ""); //这里的技巧要记一下,依次插入A,B,,, } int i = start; while (list.size() > 1) { //这个循环也很经典 i = (i - 1 + distance) % list.size(); //i-1是为了将序号转为数组对应元素 System.out.print("删除" + list.remove(i).toString() + ","); System.out.println(list.toString()); } System.out.println("被赦免者是:" + list.get(0).toString()); } public static void main(String[] args) { // TODO Auto-generated method stub new Josephus(5, 0, 2); //测试例子 } }
显示结果如下:
注意上述代码,要和导入SeqList类(顺序表)才可以执行