猴子选大王问题(java解决)

   日期:2020-09-04     浏览:107    评论:0    
核心提示:n个猴子围成一圈,从编号为k的开始报数1-2-m-1-2-m-……报“m”的猴子就被淘汰,游戏一直进行到圈内只剩一只猴子它就是猴大王了。想了很长时间不会,问了@Spider-gty,得知用两个一维数组模拟圈可以解决,下面是代码:class MonkeyProblem { public static void main(String[] args) { int k=17; int[] last=new int[k+1]; int[] next=new int[k+1]; last[

n个猴子围成一圈,从编号为k的开始报数1-2-m-1-2-m-……报“m”的猴子就被淘汰,游戏一直进行到圈内只剩一只猴子它就是猴大王了。
想了很长时间不会,问了@Spider-gty,得知用两个一维数组模拟圈可以解决,下面是代码:

class MonkeyProblem 
{
	public static void main(String[] args) 
	{
		int k=17;
		int[] last=new int[k+1];
		int[] next=new int[k+1];
		last[1]=k;next[1]=2;
		last[k]=k-1;next[k]=1;
		for(int i=2;i<=k-1;i++)
		{
			last[i]=i-1;
		    next[i]=i+1;
		}
	    
		int result=solve(last,next,1,10);
		System.out.println(result);
		
	}
    // Find the correct monkey;
    //模拟报数过程
	static int count(int[] l,int[] n,int k,int m)
		//l是上一个,n是下一个,k是某位置开始,m是往下数多少位
	{
		 
         if(m==1) return  k;
         k=n[k];
         return count(l,n,k,m-1);
	}
	//模拟淘汰过程,opted指被选中报到m的猴子
	static void eliminate(int[] l,int[] n,int opted)
	{
		n[l[opted]]=n[opted];
		l[n[opted]]=l[opted];
	}
	static int solve(int[] l,int[] n,int k ,int m)
	{
		if(n[k]==k) return k;
		int opted=count(l,n,k,m);
		eliminate(l,n,opted);
		int next=n[opted];
		return solve(l,n,next,m);
	}	
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服