package com.coding.basic.queue;
import java.util.ArrayList;
import java.util.List;
import com.coding.basic.Queue;
/**
* 用Queue来实现Josephus问题
* 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死,直到最后一个人留下来
* @author liuxin
*
*/
public class Josephus {
public static List<Integer> execute(int n, int m){
List<Integer> list=new ArrayList<Integer>();
Queue queue1=new Queue();
Queue queue2=new Queue();
for(int i=0;i<n;i++){
queue1.enQueue(i);
}
int start = 0;
while(queue1.size()>1){
int tag = 1;
int i=0;
while(tag<m){
if(i==start){
if(!queue1.isEmpty())
queue2.enQueue(queue1.deQueue());
else{
reset(queue1,queue2);
queue2.enQueue(queue1.deQueue());
}
tag++;
}
else{
queue2.enQueue(queue1.deQueue());
i++;
}
}
if(tag==m){
Object o;
if(queue1.isEmpty()){
o=queue2.deQueue();
}
else
o=queue1.deQueue();
list.add((Integer) o);
start=queue2.size();
}
if(queue1.size()+queue2.size()>1)
reset(queue1,queue2);
else{
if(!queue1.isEmpty())
list.add((Integer) queue1.deQueue());
if(!queue2.isEmpty())
list.add((Integer) queue2.deQueue());
}
}
return list;
}
private static void reset(Queue queue1,Queue queue2){
if(queue1.isEmpty()){
while(!queue2.isEmpty()){
queue1.enQueue(queue2.deQueue());
}
}
else{
while(!queue1.isEmpty()){
queue2.enQueue(queue1.deQueue());
}
while(!queue2.isEmpty()){
queue1.enQueue(queue2.deQueue());
}
}
}
}