我是靠谱客的博主 动人大雁,最近开发中收集的这篇文章主要介绍已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直至杀掉所有人,当剩下,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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的那个人又出列;依此规律重复下去,直至杀掉所有人,当剩下所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部