作者:mobiledu2502879833 | 来源:互联网 | 2022-11-23 15:00
最近我参加了编码挑战,我的得分只有50%.很少有测试用例执行我的代码失败,我无法找到代码失败的原因.所以我在下面添加了问题和我的代码.我很感谢您帮助找到测试失败的原因.
需求
最好的猫的竞争即将来临.比赛由几场决斗组成.在每次决斗中,两只猫都站在一条彼此面对的无限线上.年长的猫开始 - 它必须以1或2个猫单位向对手移动.他们俩都不能回去,跳过他的对手或分享同一个位置.猫主人尽可能地训练他们的猫,因此他们的宠物可以最佳地进行游戏.无法移动的猫会失去.
输入
输入的第一行包含测试次数t(t≤1000).每个测试由4个整数组成:第一只猫的年龄和位置,然后是第二只猫的年龄和位置.没有两只猫有相同的年龄.此任务中的任何计算都不会超过该数字2**31 - 1
.
产量
对于每个测试打印1,如果第一只猫获胜,否则为0.
例
输入:
1
10 1 9 5
输出:
0
说明: Cat 1
可以移动到任何一个字段2
或3
.在接下来的动作中,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 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;
}
}
}
结果
1> Dmitry Byche..:
让我们分析一下游戏.当一只猫移动失去游戏?首先,每只猫的位置与猫之间的距离无关紧要:如果在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 == 3
和3 % 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
这类似于那种从一堆中移除1到3根棍子的游戏策略.尽管我的雌猫不会赞同你对默认猫性别的选择的立场.