1. 程式人生 > >Josephus環問題求解(Java實現)

Josephus環問題求解(Java實現)

Josephus環問題:

古代某法官要判決number個犯人的死刑,他有一條荒唐的法律,將犯人站成一個圓圈,從第start個人開始數起,每數到第distance個犯人,就拉出來處決,然後再從下一個開始數distance個,數到的人再處決,......,直到剩下最後一個犯人予以赦免。
舉例:當number=5,start=0,distance=2時,Josephus環問題解決的Java程式碼如下(SeqList類見Java實現順序表及常見操作):

public class JosephusProblem {
	public JosephusProblem(int number,int start,int distance){
		//建立Josephus環並求解,引數制定環的長度,起始位置,計數
		System.out.println("Josephus:number="+number+" start="+start+" distance="+distance);
		//建立順序表例項,元素型別為String型別,構造方法引數指定順序表容量
		SeqList<String> list = new SeqList<String>(number);
		for(int i=0;i<number;i++){
			//插入ABCDE
			list.insert((char)('A'+i)+"");
		}
		//打印表的內容
		System.out.println(list.toString());
		int i = start;
		while(list.size()>1){
			//按照迴圈方式對錶進行遍歷
			//由於是環,所以對i值做如下處理
			i = (i+distance-1)%list.size();
			//處決
			System.out.println("刪除"+list.remove(i).toString()+",");
			System.out.println(list.toString());
		}
		System.out.println("被赦免者是:"+list.get(0).toString());
	}
	public static void main(String args[]){
		new JosephusProblem(5, 0, 2);
	}
}