编程挑战:最好的猫的竞争即将来临

Pur*_*man 3 c# algorithm

最近我参加了编码挑战,我的得分只有50%.很少有测试用例执行我的代码失败,我无法找到代码失败的原因.所以我在下面添加了问题和我的代码.我很感谢您帮助找到测试失败原因.

需求

最好的猫的竞争即将来临.比赛由几场决斗组成.在每次决斗中,两只猫都站在一条彼此面对的无限线上.年长的猫开始 - 它必须以1或2个猫单位向对手移动.他们俩都不能回去,跳过他的对手或分享同一个位置.猫主人尽可能地训练他们的猫,因此他们的宠物可以最佳地进行游戏.无法移动的猫会失去.

输入

输入的第一行包含测试次数t(t≤1000).每个测试由4个整数组成:第一只猫的年龄和位置,然后是第二只猫的年龄和位置.没有两只猫有相同的年龄.此任务中的任何计算都不会超过该数字2**31 - 1.

产量

对于每个测试打印1,如果第一只猫获胜,否则为0.

输入:

1
10 1 9 5
Run Code Online (Sandbox Code Playgroud)

输出:

0
Run Code Online (Sandbox Code Playgroud)

说明: Cat 1可以移动到任何一个字段23.在接下来的动作中,2无论对手的决定能否阻挡他并赢得胜利.

我的守则

using System;
using System.Linq;

namespace Solution
{
    class Solution
    {
        static void Main(string[] args)
        {
            var input1 = Console.ReadLine().Trim();
            var numOfTest = Convert.ToInt32(input1);

            for (int i = 0; i < numOfTest; i++)
            {
                var input2 = Console.ReadLine().Trim();
                var catDetails = input2.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Select(x => Convert.ToInt32(x)).ToArray();
                int result = -1;

                if (catDetails[0] == catDetails[2])
                {
                    Console.WriteLine(-1);
                    break;
                }

                if(catDetails[0] > catDetails[2])
                    result = CalculateWinningResult(catDetails[0], catDetails[1], catDetails[2], catDetails[3], 1);
                else
                    result = CalculateWinningResult(catDetails[0], catDetails[1], catDetails[2], catDetails[3], 2);

                Console.WriteLine(result);
            }
        }

        private static int CalculateWinningResult(int cat1Age, int cat1Position, int cat2Age, int cat2Position, int moveCat)
        {

            switch (moveCat)
            {
                case 1:

                    cat1Position = CalculateCatPosition(cat1Position, cat2Position);
                    if (cat1Position == 0)
                        return 0;
                    else
                        return CalculateWinningResult(cat1Age, cat1Position, cat2Age, cat2Position, 2);
                case 2:
                    cat2Position = CalculateCatPosition(cat2Position, cat1Position);
                    if (cat2Position == 0)
                        return 1;
                    else
                        return CalculateWinningResult(cat1Age, cat1Position, cat2Age, cat2Position, 1);
            }
            return 0;
        }

        private static int CalculateCatPosition(int currentCatPosition, int opponentCatPosition)
        {
            int tempPosition;
            if (currentCatPosition > opponentCatPosition)
            {
                tempPosition = (currentCatPosition - 1);

                if (tempPosition <= opponentCatPosition)
                    return 0;
                else
                {
                    tempPosition = (currentCatPosition - 2);
                    if (tempPosition >= opponentCatPosition)
                        return 0;
                    else
                        currentCatPosition = tempPosition;
                }
            }
            else
            {
                tempPosition = (currentCatPosition + 1);

                if (tempPosition <= opponentCatPosition)
                    return 0;
                else
                {
                    tempPosition = (currentCatPosition + 2);
                    if (tempPosition >= opponentCatPosition)
                        return 0;
                    else
                        currentCatPosition = tempPosition;
                }
            }

            return currentCatPosition;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果测试用例结果

Dmi*_*nko 8

让我们分析一下游戏.当一只猫移动失去游戏?首先,每只猫的位置与猫之间的距离无关紧要:如果在10 1 9 5测试中,移动中10 101 9 105的猫比移动中的猫损失一样.

现在,让我们画一个简单的表格:

   distance | cat on move
   ----------------------
          0 | Loses (evident: he is blocked)
          1 | Wins
          2 | Wins
          3 | Loses
          4 | Wins
          5 | Wins
          6 | Loses 
          7 | Wins
          8 | Wins
          9 | Loses 
         10 | Wins
         11 | Wins
         12 | Loses 
....
Run Code Online (Sandbox Code Playgroud)

你能看到这种模式吗?如果猫之间的距离可以被 3移动失去的猫整除 ; 否则他(猫是"他"或"她",从不"它"!)获胜,他的策略是保持他和他的对手之间的距离可被整除3.你可以通过归纳证明它.

对于实例:10 1 9 5例如,距离是5 - 1 - 1 == 33 % 3 == 0(距离可被整除3),因此移动的猫(10岁月)会失去.

伪代码:(不要破坏乐趣;请自己实现C#代码).如果给age1 x1 age2 x2猫的年龄和初始位置4个数字,我们可以找到胜者如下:

 if ((Abs(x2 - x1) - 1) % 3 == 0) then // if distance divisible by 3?
   // Yes: Cat's on move loses
   if (age1 > age2) then 
     return 1
   else      
     return 0
 else  
   // No: Cat's on move wins
   if (age1 > age2) then 
     return 0
   else      
     return 1
Run Code Online (Sandbox Code Playgroud)

  • 这类似于那种从一堆中移除1到3根棍子的游戏策略.尽管我的雌猫不会赞同你对默认猫性别的选择的立场. (2认同)