最近我参加了一个编码挑战赛,我只能得到50%的分数。执行代码失败的测试用例很少,我无法在代码中找到失败的原因。所以我在下面添加了问题和代码。我感谢您帮助我找到失败测试用例的原因。
要求
竞争最好的猫就要来了。比赛包括
几场决斗。在每次决斗中,两只猫都站在一条无限长的线上
面对面。年长的猫开始-它必须向他的
对手1或2个猫单位他们两个都不能回去,跳过去
他的对手或同处一个位置。养猫人训练他们的猫
尽他们所能,让他们的宠物玩得最好。那只猫
动不了就输了。
输入
输入的第一行包含测试次数t(t≤1000)每个
测试由4个整数组成:第一只猫的年龄和位置
第二只猫的年龄和位置没有两只猫是一样的
年龄。此任务中的任何计算都不会超过2**31 - 1
。
输出
对于每个测试,如果第一只猫赢了,则打印1,否则打印0。
例子
输入:
1
10 1 9 5
输出:
0
说明:Cat
1
可以移动到字段2
或3
下一步行动不管对手的决定如何,猫都能阻止他并获胜。
我的代码
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;
}
}
}
结果
最佳答案
让我们分析一下这个游戏。当一只移动的猫输了比赛?首先,不在乎每只猫的位置,而是猫与猫之间的距离:
如果在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 5
和5 - 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