1. 程式人生 > >約瑟夫環數組簡單實現

約瑟夫環數組簡單實現

sys 進行 記錄 約瑟夫環 人的 out () live ava

約瑟夫環是一個很有意思的算法。大意就是:羅馬人占領了喬塔帕特,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);
        }

}


測試結果:
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

約瑟夫環數組簡單實現