游戏:
有一个盒子分为五个部分。盒子里面放着鼠标。坐在箱子附近的猫
每转一圈,猫都把爪子放在那个部分上
1)如果猫用鼠标将爪子放在该部分,则游戏结束
2)否则,鼠标移动到相邻部分,包括猫爪下面的部分
我正试图寻找一种能以最少的动作(平均)获胜的策略猫
链 - 循环重复猫的移动顺序。
以下函数返回给定链的平均获胜次数:
public static double computePerformanceForChain(String chain)
{
final int iterationsCount = 10000;
int catPos, mousePos,steps=0;
Random random = new Random(System.currentTimeMillis());
for(int i=0; i<iterationsCount; i++)
{
mousePos=random.nextInt(5);
for(int j=0;;j++)
{
catPos=Integer.parseInt(String.valueOf(chain.charAt(j%chain.length())));
steps++;
if(catPos==mousePos) break;
if(mousePos==0) mousePos=1;
else if(mousePos==4) mousePos=3;
else mousePos+=random.nextInt(2)*2-1;
}
}
return (double)steps/iterationsCount;
}
例如,computePerformanceForChain("1133")
返回约3
但是对于链"23"
函数循环
为什么会这样?感谢。
答案 0 :(得分:2)
简单回答:无法保证执行将退出内循环
检查内循环:
for(int j=0;;j++) {
catPos=Integer.parseInt(String.valueOf(chain.charAt(j%chain.length())));
steps++;
if(catPos==mousePos) break;
if(mousePos==0) mousePos=1;
else if(mousePos==4) mousePos=3;
else mousePos+=random.nextInt(2)*2-1;
}
因此,在每次迭代mousePos
的奇偶校验都会发生变化。所以如果:
mousePos
最初被分配到奇数chain
是偶数序列,例如“23”然后catPos
将永远不会等于mousePos
并且循环永远不会完成。
简单地说:如果鼠标最初处于奇数部分(例如第3部分),则cat无法用2-3链捕获它并且将无限重复此序列。
答案 1 :(得分:1)
你对猫的序列让猫从一个偶数平方移动到一个奇数平方,并重复这样做,总是偶数,奇数,偶数,奇数。鼠标,因为它总是移动到相邻的方块也总是从偶数到奇数到偶数到奇数。因此,鼠标将在右方块上启动的几率为50/50。如果当猫移动到偶数方格时鼠标位于奇数方格上,则当猫尝试奇数方格时,鼠标移动到偶数方格。
在这种情况下,猫永远不会捕捉到鼠标。
任何偶数编号的解决方案都是如此,其中猫总是从奇数到偶数到奇数到偶数。