約瑟夫環(Josephus Circle)

約瑟夫環的問題內容是:
       古代某位法官要判決n個犯人死刑,他有一條荒唐的法律:讓n個犯人站成一個圓圈,從第s個人開始數起,每數到第d個犯人時就將其拉出來處決;然後再數d個,數到的人再被處決......直到剩下最後一個可以被赦免。
       解析:
(1)由於無法預知犯人個數,並需對其進行操作,可以考慮使用向量類。
(2)初始化。創建一個vector類的向量對象v,使用泛型。執行方法v.add(),將犯人的序號打包成Integer對象,添加到向量v中。
(3)設置current爲當前欲刪除的元素的下標。如果從第1個人開始數起,則current的初值應設置爲第一個人的前一位,即current=s-1。
(4)循環。當v中元素多於1個時(v.size()>0),調用v.remove()方法刪除下標爲current的元素。current的值一直在增加,但既不能超過數組下標範圍,又要實現環形結構。所以current的變化規律是current=(current+1)%v.size(),其中v.size()是v的實際元素個數,每刪除一個元素,v.size()的值少1。
(5)爲了更好的瞭解向量中的元素情況,每次循環都輸出向量中的全部元素值,調用(Integer)v.get(i)方法將獲得的下標爲i的Object類元素轉化爲Integer對象,再調用Integer類的intValue()方法輸出相應的int值。
(6)當循環停止,向量v中只剩下一個元素,這就是要找的人。
import java.util.Vector;

public class JosePhus {
	public static void main(String args[]){
		int n=7,s=2,d=4;
		Vector<Integer>v=new Vector<Integer>(n);
		for(int i=0;i<n;i++){
			v.add(i);
		}
		
		int current=s-1;
		while(v.size()>1){
			System.out.println("Vector: ");
			for(int i=0;i<v.size();i++){
				System.out.println((v.get(i)).intValue()+" ");
			}
			int j=0;
			while(j<d){
				current=(current+1)%v.size();
				j++;
			}
			System.out.println("\tcurrent="+current+" ");
			v.remove(current);
		}
		System.out.println("被赦免者是:"+(v.get(0)).intValue());
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章