1. 程式人生 > >資料結構與演算法Java版——約瑟夫環問題

資料結構與演算法Java版——約瑟夫環問題

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

簡單的說就是規定數到第N個人就殺了他,比如殺第五個人,那麼 1 2 3 4 5就殺了5。

程式碼如下:

public class Josephus {
    /**
     * 玩遊戲的人數
     */
    private final int circleNum = 20;
    /**
     *  數到五個就上天
     */
    private
final int unluckyNum = 5; class Person { //這個人的下一個 Person next; int val; public Person(int val) { this.val = val; } } public void killPerson() { Person header = new Person(1); Person x = header; Person next = null
; //構成環 for (int i = 2; i <= circleNum; i++) { next = new Person(i); x.next = next; x = next; } //首尾相連 x.next = header; int num = 1; System.out.println("被殺的順序為:"); //迴圈直到只剩一個人 while (x.next!=x) { if
(num==5){ System.out.print(x.next.val+" "); x.next = x.next.next; num=1; } x = x.next; num++; } System.out.println("\n最後剩下:"+x.val); } public static void main(String[] args) { // TODO Auto-generated method stub Josephus josephus = new Josephus(); josephus.killPerson(); } }

如圖所示,就完成了這個演算法。