0

游戏:
有一个盒子分为五个部分。盒子里面是老鼠。猫坐在盒子附近。
每转一圈,猫都会将爪子放在该部分上。
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"函数循环。
为什么会这样?谢谢。

4

2 回答 2

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”

thencatPos永远不会等于mousePos并且循环永远不会结束。

简单地说:如果鼠标最初在奇数段(例如第 3 段),那么 cat 无法用 2-3 链捕获它,并将无限重复此序列。

于 2013-02-27T07:01:14.407 回答
1

你的猫序列让猫从偶数格移动到奇数格,并重复执行此操作,总是偶数、奇数、偶数、奇数。鼠标,因为它总是移动到相邻的方格,所以它也总是从偶数到奇数到偶数到奇数。因此,有 50/50 的机会鼠标从右侧方块开始。如果猫移动到偶数格时鼠标在奇数格上,那么当猫尝试奇数格时鼠标移动到偶数格。

在这种情况下,猫永远抓不到老鼠。

这对于猫总是从奇数到偶数到奇数到偶数的任何偶数解决方案都是正确的。

于 2013-02-27T07:09:51.567 回答