約瑟夫環問題: 41個猶太人為了表示不像羅馬人屈服,決定集體自殺,其中由約瑟夫和他的朋友,他們兩個不想自殺。自殺的規則是41個人圍成圈,輪流報數,報到3的自殺,下一個從1開始從新報,以此類推。 約瑟夫和他的朋友想活下來就要讓他們成為最后兩個人,然后放棄自殺規則。問約瑟夫和他的朋友應該在環的哪兩個位置?
public static int[] Josep(int total,int live){ int[] dieOrder=new int[total];//記錄約瑟夫編號,即死亡順序 for(int i=0;i<total;i++){//逐個初始化 dieOrder[i]=0; } int i=0;//游標 int call=1;//報數 int die=0;//死亡人數 while(die<total-live){ if(i==total){ i=0;//如果到尾回到頭,形成環 } if(dieOrder[i]==0){//活人計數 if(call<3){ call++; }else{ dieOrder[i]=++die;//記錄約瑟夫編號 //System.out.更復雜的約瑟夫環是自殺規則不定,每個人有一個數字,一個人自殺后,后面的人需要報數到這個數字才自殺。需要更靈活:public static int[] hardJosep(int total,int live,int[] no){//no存儲每個人的自殺規則數字 int[] dieOrder=new int[total];//記錄約瑟夫編號,即死亡順序 for(int i=0;i<total;i++){//逐個初始化 dieOrder[i]=0; } int i=0;//游標 int call=1;//報數 int die=0;//死亡人數 int callNum=no[0]; while(die<total-live){ if(i==total){ i=0;//如果到尾回到頭,形成環 } if(dieOrder[i]==0){//活人計數 if(call<callNum){ call++; }else{ dieOrder[i]=++die;//記錄約瑟夫編號 System.out.println("第"+die+"個自殺的人是 "+(i+1)+"號"); call=1; callNum=no[i]; } } i++;//移動位置 } int[] survive=new int[live]; int k=0; System.out.print("可以活下來的位置是:"); for(int j=0;j<total;j++){ if(dieOrder[j]==0){ System.out.print(j+1+" "); survive[k]=j+1; k++; } } return survive; }當no都是3時和普通約瑟夫環相同,當給no附復雜的數組,就會產生不同的結果。
public static void main(String[] args){ //JosepCircle.Josep(41, 2); int[] no=new int[41]; for(int i=0;i<41;i++){ no[i]=i+1; } JosepCircle.hardJosep(41, 2, no); }新聞熱點
疑難解答