約瑟夫問題的一個簡單java實現

約瑟夫問題(有時也稱為約瑟夫斯置換),是一個出現在計算機科學和數學中的問題。在計算機編程的算法中,類似問題又稱為約瑟夫環。

有n個囚犯站成一個圓圈,準備處決。首先從一個人開始,越過 k-2個人(因為第一個人已經被越過),并殺掉第k個人。接著,再越過 k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。

問題是,給定了n和k,一開始要站在什么地方才能避免被處決?

這里不研究數學解法,用java模擬整個過程。

通常解決這類問題時我們把編號從0~n-1,最后結果+1即為原問題的解,而ArrayList下標正好從0開始,代碼如下:

public static void main(String[] args) {
    joseph(4, 2, 1);
}

/**
 * @param total 總人數
 * @param count 數到幾出列
 * @param start 從誰開始
 */
public static void joseph(int total, int count, int start){
    
    ArrayList<String> list = new ArrayList<String>();
    for (int i = 1; i <= total; i++) {
        list.add("person-"+i);
    }
    
    int startIndex = start - 1;
    int countActual = count - 1;
    while(list.size() > 0) {
        startIndex = (startIndex + countActual) % list.size();
        
        System.out.println(list);
        System.out.println(list.get(startIndex));
        list.remove(startIndex);
    }
}

結果如下:


joseph.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容