約瑟夫環是一個頗有意思的算法。大意就是:羅馬人佔領了喬塔帕特,41我的藏在一個山洞中躲過了這場浩劫。這41我的中,包括歷史學家約瑟夫(Josephus)和他的一個朋友。剩餘的31我的爲了表示不想羅馬人屈服,決定集體自殺。你們決定了一個自殺方案,全部這41我的圍成一個圈,由第1我的開始順時針報數,每報數爲3的人馬上就自殺,而後再由下一我的從新開始報數,仍然是每報數爲3的人就馬上自殺,直到全部人都自殺身亡爲止。 約瑟夫和他的朋友並不想自殺,因而約瑟夫想到了一個計策,他們兩個一樣參與到自殺方案中,可是最後卻躲過了自殺。
算法思路: 41我的圍成一個圈報數,數到3的人就馬上自殺。約瑟夫和朋友想活下來的話,也就是當39我的都數到3並馬上自殺後,約瑟夫和朋友就不遵照自殺的約定,他們就活了下來,也就是他們倆站的初始位置要正確。 如今咱們用一個int型數組來存放41我的,數組元素初始值都爲0,當第幾個數到3的人自殺後,咱們用約瑟夫環數標記爲幾,並記錄自殺者的初始位置。當41我的所有自殺後,咱們遍歷找出倒數前兩個自殺的初始位置後,這兩個自殺的初始位置就是咱們要找的結果。
如今咱們用java代碼簡單實現: public static final int MaxNum = 41; //約瑟夫環最大成員數 public static final int KillNum = 3; // 數到該數時須要自殺的數字 public static void Josephus(int alive){ int count = 1; //統計自殺的人數,每自殺一我的,則count加1,同時也可用來標記約瑟夫成員位置。 int postion = -1; // 用來定位約瑟夫環成員位置 int i = 0; //初始化一個數組 數組初始值爲0,值爲0時爲沒有自殺。 int []person = new int[MaxNum]; //遍歷數組,並標記須要自殺的人 while(count<=MaxNum){ do{ postion = (postion+1)%MaxNum; // 定位約瑟夫環的成員位置 if(person[postion] == 0){ // 篩選沒自殺過的成員,自殺過的成員則不進行處理 ++i; } if(i == KillNum){ // 當沒自殺過的成員數到3時,該成員自殺。此刻跳出do while 循環,將自殺者標記 i = 0; break; } }while(true); person[postion] = count; // count用來統計自殺者的個數,同時也標記爲初始位置爲(postion+1)自殺者的約瑟夫環環號 System.out.println("位置在"+(postion+1)+"的成員自殺!約瑟夫環號爲:"+person[postion]); count++; // 統計自殺的人數,每自殺一我的,則count加1。 } System.out.println("---------------------------------------------------------------------------------------------------------"); // 計算想要活下來的人須要站的位置 alive = MaxNum - alive; // 自殺者的最大約瑟夫環數 for(i = 0;i<MaxNum;i++){ // 遍歷約瑟夫環中的全部人 if(person[i]>alive){ // 活下來的人的約瑟夫環數大於自殺者的最大約瑟夫環數 System.out.println("不想要自殺的人應該站的位置是: "+(i+1)+",約瑟夫環號爲:"+person[i]); } } } public static void main(String []args){ int alive; Scanner input = new Scanner(System.in); alive = input.nextInt(); Josephus(alive); }
}java
測試結果: 2
位置在3的成員自殺!約瑟夫環號爲:1
位置在6的成員自殺!約瑟夫環號爲:2
位置在9的成員自殺!約瑟夫環號爲:3
位置在12的成員自殺!約瑟夫環號爲:4
位置在15的成員自殺!約瑟夫環號爲:5
位置在18的成員自殺!約瑟夫環號爲:6
位置在21的成員自殺!約瑟夫環號爲:7
位置在24的成員自殺!約瑟夫環號爲:8
位置在27的成員自殺!約瑟夫環號爲:9
位置在30的成員自殺!約瑟夫環號爲:10
位置在33的成員自殺!約瑟夫環號爲:11
位置在36的成員自殺!約瑟夫環號爲:12
位置在39的成員自殺!約瑟夫環號爲:13
位置在1的成員自殺!約瑟夫環號爲:14
位置在5的成員自殺!約瑟夫環號爲:15
位置在10的成員自殺!約瑟夫環號爲:16
位置在14的成員自殺!約瑟夫環號爲:17
位置在19的成員自殺!約瑟夫環號爲:18
位置在23的成員自殺!約瑟夫環號爲:19
位置在28的成員自殺!約瑟夫環號爲:20
位置在32的成員自殺!約瑟夫環號爲:21
位置在37的成員自殺!約瑟夫環號爲:22
位置在41的成員自殺!約瑟夫環號爲:23
位置在7的成員自殺!約瑟夫環號爲:24
位置在13的成員自殺!約瑟夫環號爲:25
位置在20的成員自殺!約瑟夫環號爲:26
位置在26的成員自殺!約瑟夫環號爲:27
位置在34的成員自殺!約瑟夫環號爲:28
位置在40的成員自殺!約瑟夫環號爲:29
位置在8的成員自殺!約瑟夫環號爲:30
位置在17的成員自殺!約瑟夫環號爲:31
位置在29的成員自殺!約瑟夫環號爲:32
位置在38的成員自殺!約瑟夫環號爲:33
位置在11的成員自殺!約瑟夫環號爲:34
位置在25的成員自殺!約瑟夫環號爲:35
位置在2的成員自殺!約瑟夫環號爲:36
位置在22的成員自殺!約瑟夫環號爲:37
位置在4的成員自殺!約瑟夫環號爲:38
位置在35的成員自殺!約瑟夫環號爲:39
位置在16的成員自殺!約瑟夫環號爲:40
位置在31的成員自殺!約瑟夫環號爲:41
————————————————————————————————————————
不想要自殺的人應該站的位置是: 16,約瑟夫環號爲:40
不想要自殺的人應該站的位置是: 31,約瑟夫環號爲:41算法