據(jù)說著名猶太歷史學(xué)家 Josephus有過以下的故事:在羅馬人占領(lǐng)喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數(shù),每報數(shù)到第3人該人就必須自殺,然后再由下一個重新報數(shù),直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。
首先從一個人開始,越過k-2個人(因為第一個人已經(jīng)被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續(xù)活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。
/** * 實現(xiàn)約瑟夫問題的方法 * @param sum 總?cè)藬?shù) * @param n 報數(shù)報到n的人自殺 */ public static void get(int sum, int n) { //將人數(shù)放到List集合中方便刪除指定元素,指定元素就表示被殺死的人 List<Integer> strs= new ArrayList<Integer>(); for (int i = 0; i < sum; i++) { strs.add(i + 1); } int i=0; //下標(biāo) while (strs.size() > 1) { /* * 數(shù)到n的數(shù)字移出去。當(dāng)一個人數(shù)到n,就將他的下標(biāo)設(shè)置成0,并刪除它 * 這樣他的下一個數(shù)就會自動往前移動,下標(biāo)變?yōu)? */ if(n==i+1){ i=0;//重新開始數(shù) System.out.PRintln("每次死去的人:"+strs.remove(i)); } //把第一個移動到最后一個,就相當(dāng)于跳過了一個人。如果沒有執(zhí)行if語句,就相當(dāng)于把跳過的第二個人移到了最后 strs.add(strs.remove(0)); i++; //跳過第二個人 } System.out.println("最后活著的人:"+strs.remove(0));//輸出最后一個數(shù)字 }}注意:
List每remove掉一個元素以后,后面的元素都會自動向前移動。
remove方法會返回被刪除的元素。
|
新聞熱點
疑難解答