总结一下这个游戏,有 N 个高度为 M 的塔,每回合玩家可以将塔减少到除以它的高度但不等于它的高度的数字,目标是让你的对手在轮到他了。
例如,如果N=2,M=2
第一个玩家输了,因为他唯一能做的就是将其中一个塔降低到高度 1,之后另一个玩家可以做的唯一动作是将另一个塔降低到高度 1,现在第一个玩家有没有动作可做。
我开始写这个,但它变得太复杂了,我无法真正看到非素数M
的“模式”,例如4
. 有没有更好的方法我应该考虑这个?
1 --> Lose
1 1 --> Lose
1 1 1 --> Lose
etc.
2 --> Win
2 2 --> Lose
2 2 2 --> Win
2 2 2 2 --> Lose
etc.
3 --> Win
3 3 --> Lose
3 3 3 --> Win
3 3 3 3 --> Lose
etc.
4 --> Win
4 4 --> Lose (see tree below)
4,4 1's turn
/ \
/ \
/ \
/ \
/ \
2,4 1,4 2's turn
/ \ \ / \
/ \ \ / \
/ \ \ / \
1,4 2,2 1,2 1,1 1,2 1's turn
/ \ \ \ \
/ \ \ \ \
1,1 1,2 1,2 1,1 1,1 2's turn
/ \
/ \
1,1 1,1 1's turn
我计算玩家 1 或 2 是否会赢的方法是
static int Winner(int n, int m)
{
if(m == 1)
return 2;
else if(IsPrime(m))
return n % 2 == 0 ? 2 : 1;
else
{
// ... ??
}
}
编辑:哇,我只是做了一个疯狂的猜测
static int Winner(int n, int m)
{
if(m == 1)
return 2;
else
return n % 2 == 0 ? 2 : 1;
}
它通过了挑战问题的所有测试用例。所以我在不明白为什么的情况下“解决”了它。