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);
}
}