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类(顺序表)才可以执行