最近我参加了编码挑战,我只能得分50%。执行我的代码失败的测试案例很少,我无法找到原因我的代码失败。所以我在下面添加了问题和代码。感谢您的帮助,帮助我们找到失败的测试用例的原因 。
要求
争夺最好猫的比赛来了。比赛包括 几个决斗。在每个决斗中,两只猫都站在无限线上 面对对方。年长的猫开始-它必须走向他的 对手以1或2个猫为单位。他们都不可以回去,跳过 他的对手还是有共同点。猫主人训练了他们的猫 他们会尽力而为,因此它们的宠物会发挥最佳性能。那只猫 无法采取行动失败。
输入
输入的第一行包含测试次数t(t≤1000)。每 测试由4个整数组成:第一只猫的年龄和位置以及 然后是第二只猫的年龄和位置。没有两只猫有相同的 年龄。此任务中的任何计算都不会超过数字
2**31 - 1
。
输出
如果第一只猫获胜,则每个测试打印1张,否则打印0张。
示例
输入:
1 10 1 9 5
输出:
0
说明:类别
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 < 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;
}
}
}
答案 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 == 3
和3 % 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的差异为奇数,则年龄较小的猫将获胜,否则年龄较大的猫将获胜。