已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直至殺掉所有人,當剩下
阿新 • • 發佈:2019-01-09
public class Game { public int fun(int N,int k,int m) { int[] array=new int[N]; //建立N個人 int n=N; //剩餘人數 for(int i=0;i<array.length;i++) { //讓每個人拿著最初編號 array[i]=i+1; } for(int i=0;i<N-1;i++) { //淘汰N-1個人 if(k==0) { k=(k+m)%n; }else { k=(k+m-1)%n; } for(int j=k;k!=0&&j<n;j++) { //一個人被淘汰,後面的補上來 array[j-1]=array[j]; } n--; } return array[0]; } public static void main(String[] args) { System.out.println("獲勝者編號為:"+new Game().fun(10,5,3)); } }
思路:
有三個變數,所以建立有三個形參的函式;
建立N個人,每個人拿著自己的最初編碼,獲勝了就能得到最初編碼了;
找到將要淘汰的人,把淘汰的人cut掉;
N個人要淘汰N-1個人,所以以上步驟進行N-1次迴圈;
返回獲勝者編碼
找到將要淘汰的人:
從第k個人開始報數,數到m的人淘汰,下一個淘汰的也就是k+m-1;
從淘汰人的下一位開始報數,數到m的人淘汰,下一個淘汰的也就是k+m //k為被淘汰的人
但是第k個人被淘汰了,原本為k+1的人就成了第k個,所以下一個淘汰的為k+m-1;
淘汰前:A B C D F //k=3
1 2 3 4 5
淘汰後:A B D F //D的編號就為3了,從他開始報數,下個人為3+m-1
1 2 3 4
有種特殊情況:當被淘汰的人為陣列中最後一位是時,他的下一位的位置不會-1,所以下一個淘汰的也就是k+m
淘汰前:A B C D F //k=5,k%=n //n為人數
1 2 3 4 5
淘汰後:A B C D //從淘汰者的下一位開始報數也就是A,A的編號並沒變,下個人為k+m
1 2 3 4
淘汰人:
只需把陣列後面的移上來佔掉位置就行