编程挑战:争夺最好的猫

时间:2018-12-28 07:03:09

标签: c# algorithm

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

要求

  

争夺最好猫的比赛来了。比赛包括   几个决斗。在每个决斗中,两只猫都站在无限线上   面对对方。年长的猫开始-它必须走向他的   对手以1或2个猫为单位。他们都不可以回去,跳过   他的对手还是有共同点。猫主人训练了他们的猫   他们会尽力而为,因此它们的宠物会发挥最佳性能。那只猫   无法采取行动失败。

输入

  

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

输出

  

如果第一只猫获胜,则每个测试打印1张,否则打印0张。

示例

  

输入:

1
10 1 9 5
     

输出:

0
     

说明:类别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;
        }
    }
}

结果 test case result

2 个答案:

答案 0 :(得分:7)

让我们分析一下游戏。当移动的猫输掉比赛时?首先,每只猫的位置都不重要,但猫之间的距离无关紧要: 如果在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 
....

您可以看到图案吗?如果猫之间的距离可被除以 3,则移动中的猫会丢失;否则,他(猫是“他”或“她”,从不“它”!)获胜,他的 策略是使他和他的对手之间的距离被3整除。您可以通过归纳法来证明这一点。

对于实例:对于10 1 9 5,距离为5 - 1 - 1 == 33 % 3 == 0(该距离可以被3整除),因此移动的猫(10岁一个)松动。

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

 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

答案 1 :(得分:0)

我尝试了下面的代码,它为我通过了所有测试方案。

public static void main(String [] args){

    Scanner sc = new Scanner(System.in);
    String n = sc.nextLine().trim();
    // Enter total number of tests
    int numOfTest = Integer.parseInt(n);
    // read cat details
    String catDetails = "";
    String[] catDetailsArr = new String[1];
    int[] catDetailsData = new int[4];
    for (int i = 0; i < numOfTest; i++) {

        catDetails = sc.nextLine().trim();

        catDetailsArr = catDetails.split(" ");



        for (int x = 0; x < catDetailsArr.length; x++) {
            catDetailsData[x] = Integer.parseInt(catDetailsArr[x]);
        }

        if (Math.abs(catDetailsData[3] - catDetailsData[1]) % 2 == 0)
            // Yes: Cat's on move loses
            if (catDetailsData[0] > catDetailsData[2])
                System.out.println("1");
            else
                System.out.println("0");
        else
        if (catDetailsData[0] > catDetailsData[2])
            System.out.println("0");
        else
            System.out.println("1");

    }

根据我们的理解,如果排名1的差异为奇数,则年龄较小的猫将获胜,否则年龄较大的猫将获胜。