最近我参加了一个编码挑战赛,我只能得到50%的分数。执行代码失败的测试用例很少,我无法在代码中找到失败的原因。所以我在下面添加了问题和代码。我感谢您帮助我找到失败测试用例的原因。
要求
竞争最好的猫就要来了。比赛包括
几场决斗。在每次决斗中,两只猫都站在一条无限长的线上
面对面。年长的猫开始-它必须向他的
对手1或2个猫单位他们两个都不能回去,跳过去
他的对手或同处一个位置。养猫人训练他们的猫
尽他们所能,让他们的宠物玩得最好。那只猫
动不了就输了。
输入
输入的第一行包含测试次数t(t≤1000)每个
测试由4个整数组成:第一只猫的年龄和位置
第二只猫的年龄和位置没有两只猫是一样的
年龄。此任务中的任何计算都不会超过2**31 - 1
输出
对于每个测试,如果第一只猫赢了,则打印1,否则打印0。
例子
输入:

1
10 1 9 5

输出:
0

说明:Cat1可以移动到字段23下一步行动
不管对手的决定如何,猫都能阻止他并获胜。
我的代码
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;
        }
    }
}

结果c# - 编程挑战:争夺最佳猫的竞争即将到来-LMLPHP

最佳答案

让我们分析一下这个游戏。当一只移动的猫输了比赛?首先,不在乎每只猫的位置,而是猫与猫之间的距离:
如果在10 1 9 5测试中,移动中的猫比移动中的猫也会丢失。
现在,让我们画一个简单的表格:

   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
....

你能看到图案吗?如果猫与猫之间的距离被10 101 9 105整除,移动中的猫将丢失;否则,它将丢失(猫是“他”或“她”,而不是“它”!)赢了,他的
策略是保持他和对手之间的距离可以被3整除。你可以用归纳法来证明。
例如:对于3情况,距离是10 1 9 55 - 1 - 1 == 3(该距离可被3 % 3 == 0整除),因此移动中的猫(3岁的猫)松开。
伪代码:(不要破坏乐趣;请自己实现C代码)当给出猫的年龄和初始位置的4个数字10时,我们可以发现获胜者如下:
 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

10-06 05:02