1. 程式人生 > >已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直至殺掉所有人,當剩下

已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直至殺掉所有人,當剩下

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

淘汰人

只需把陣列後面的移上來佔掉位置就行