Josephus问题:
- N个身陷绝境的人围成一个圈,位置记为从0到N-1,人们按顺序从0开始报数,报到数M的人会必须自杀;
- 然后下一个人继续重新开始报数,直到最后S个人幸存;
- 编写程序,输入N,M和S,打印出自杀顺序名单和幸存者名单。
基本思路:
在队列中存储0到N-1共N个数,然后依次出列,若恰好是第M个,则将该数另存,其他的不是第M个的数则依次入列,直到队列总长等于S。
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
/**
* Josephus问题:
* N个身陷绝境的人围成一个圈,位置记为从0到N-1,人们按顺序从0开始报数,报到数M的人会必须自杀,
* 然后下一个人继续重新开始报数,直到最后S个人幸存。基于Queue编写程序,输入N和M,打印出自杀顺序。
*/
public class JosephusQuestionSolver {
private Queue<Integer> queue;
private int unluckyNumber;
private int survivors;
public JosephusQuestionSolver(int numbers, int unluckyNumber, int survivors) {
queue = new ArrayDeque<>();
for (int i = 0; i < numbers; ++i) {
queue.add(i);
}
this.unluckyNumber = unluckyNumber;
this.survivors = survivors;
}
public List<Integer> getSuicideList() {
List<Integer> suicideList = new ArrayList<>();
while (queue.size() > survivors) {
for (int i = 0; i <= unluckyNumber; ++i) {
int person = queue.remove();
if (i != unluckyNumber) {
queue.add(person);
} else {
suicideList.add(person);
}
}
}
return suicideList;
}
public List<Integer> getSurvivorList() {
List<Integer> survivorList = new ArrayList<>();
while (!queue.isEmpty()) {
survivorList.add(queue.remove());
}
return survivorList;
}
}
class JosephusQuestionTest {
public static void main(String[] args) {
JosephusQuestionSolver josephusQuetionSolver = new JosephusQuestionSolver(41, 7, 3);
System.out.println("Suicide List:\n" + josephusQuetionSolver.getSuicideList());
System.out.println("Survivor List:\n" + josephusQuetionSolver.getSurvivorList());
}
}