概述
public class Game {
public int fun(int N,int k,int m) { //第k个人
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
淘汰人:
只需把数组后面的移上来占掉位置就行
最后
以上就是动人大雁为你收集整理的已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直至杀掉所有人,当剩下的全部内容,希望文章能够帮你解决已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直至杀掉所有人,当剩下所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复