資料結構與演算法Java版——約瑟夫環問題
阿新 • • 發佈:2019-01-23
有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();
}
}
如圖所示,就完成了這個演算法。