使用循環雙鏈表求解約瑟夫環問題

約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號爲k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。

 
約瑟夫環運作如下:
1、一羣人圍在一起坐成環狀(如:N)
2、從某個編號開始報數(如:K)
3、數到某個數(如:M)的時候,此人出列,下一個人重新報數
4、一直循環,直到所有人出列,約瑟夫環結束
 
下面是使用循環雙鏈表解約瑟夫環問題的代碼:
package com.clarck.datastructure.dlinked;

/**
 * 循環雙鏈表解約瑟夫環問題
 * 
 * @author clarck
 * 
 */
public class Josephus_CirDoublyLinkedList {
    /**
     * 存儲約瑟夫環中多個對象
     */
    private CirDoublyLinkedList<String> list;

    /**
     * 創建約瑟夫環並求解,參數指定環長度、起始位置、計數
     * 
     * @param number
     * @param start
     * @param distance
     */
    public Josephus_CirDoublyLinkedList(int number, int start, int distance) {
        this.list = new CirDoublyLinkedList<String>();
        for (int i = 0; i < number; i++)
            this.list.append(new String((char) ('A' + i) + ""));
        System.out
                .print("約瑟夫環(" + number + "," + start + "," + distance + "),");
        System.out.println(this.list.toString());

        // 計數起始位置
        int index = start - 1;
        // 多於一個對象時循環
        while (this.list.length() > 1) {
            index = (index + distance - 1) % this.list.length();
            System.out.print("刪除" + this.list.remove(index).toString() + ","); // 刪除指定位置對象
            System.out.println(this.list.toString());
        }
        System.out.println("被赦免者是" + list.get(0).toString());
    }

    public static void main(String args[]) {
        new Josephus_CirDoublyLinkedList(5, 1, 2);
    }

}
運行結果:
約瑟夫環(5,1,2),(A,B,C,D,E)
刪除B,(A,C,D,E)
刪除D,(A,C,E)
刪除A,(C,E)
刪除E,(C)
被赦免者是C



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章