約瑟夫環簡介,問題以及java實現
阿新 • • 發佈:2019-02-04
問題:一群猴子排成一圈,按1,2,…….,n依次編號。然後從第一隻開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,再把它踢出去………………….,如此不停的進行下去,直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求:輸入m,n,輸出最後的那個大王的編號。
很明顯,這是一個約瑟夫環的問題,它的特徵如下:
1、一群人圍在一起坐成環狀(例如N個人)
2、從某個編號開始報數(如:K)
3、數到某個數(如:M)的時候,此人出列,下一個人重新報數
4、一直迴圈,直到所有人出列[3] ,約瑟夫環結束
知道了它的原理,那麼我們解決起來也就有針對性了。程式碼如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class josephus {
/**
* @param args
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入總的數目:");
int totalNum = sc.nextInt();
System.out.println("請輸入報數的編號:" );
int cycleNum = sc.nextInt();
jsoephus_func(totalNum,cycleNum);
}
private static void jsoephus_func(int totalNum, int cycleNum) {
//定義連結串列
List<Integer> list = new ArrayList<Integer>();//初始的人數
List<Integer> resultlist = new ArrayList<Integer>();//點到人
for(int i=1;i<=totalNum;i++){//把所有的猴子的編號都儲存到連結串列中去
list.add(i);
}
int count = 0;
for(int j =0;j<totalNum;j++){
count = (--count+cycleNum)%list.size();
//System.out.print(list.get(count));//將選中的每一個猴子的編號都打印出來
resultlist.add(list.remove(count));//將點到的每一個猴子的編號都儲存到連結串列中,最後一個即是我們想要的答案
}
System.out.println(resultlist.get(resultlist.size()-1));//打印出最後一個點到猴子的編號
}
}
結果顯示如下:
說明:
輸入8,表示總共有8只猴子,輸入2,表示踢出猴子的編號是從2開始的。
首先是編號為2的猴子,然後是編號4,編號6,編號8,編號3,編號7,編號5,最後剩下的就是編號1了。
可以把整個踢出過程打印出來,顯示如下:
當然啦,這個也可以用遞迴來做。具體怎麼做,這裡就不在介紹了,若有興趣,可自行百度。