考虑以下游戏:
您有一个由N个立方体组成的塔。玩家每回合只能从塔中拿取素数或素数立方的幂。 获胜者是最后一个玩过的玩家,这意味着最后一个玩家将获得素数(或素数的幂)的多维数据集,而不再剩下任何多维数据集。
注意:
1)每转的运行时间必须最短。
2)匝数没有限制
目标:
a)在只有一个塔的情况下,找到一种算法来赢得比赛,并确定我们是否需要成为第一玩家或第二玩家。
b)与a相同,但是现在我们有2个塔,它们具有不同数量的立方体。
示例: 如果我们的数字N = 6,如果我们先玩:
我们可以拿1,但是第二名玩家将拿5并获胜
我们可以拿2,但是玩家2将拿4并赢(2是素数,2的幂)
我们可以拿3,但是第二名玩家将拿3并获胜
我们可以拿4,但是玩家2可以拿2并获胜
我们可以拿5,但是玩家2可以拿1并获胜
因此,在这种情况下,算法应确定我们必须扮演第二个角色,在这种特定情况下,我们可以选择删除任意数量的立方体。
答案 0 :(得分:3)
多桩游戏是一个有限的加法游戏,因为每个塔都是一个单独的游戏,人们可以选择接下来要玩的游戏,并且可以确保游戏以明确的胜利者以有限的步数终止。所有加法游戏都可以减少到Nim。
具体来说,立即输掉的尼姆得分是0
,立即赢取的是1
,否则大小为n
的单个塔具有您可能的最小尼姆得分一动不动,就可以从0, 1, 2, ...
中获得可能的尼姆分数。
这使我们可以递归计算单个塔的nim分数。获胜的策略是尝试始终给对方得分0
,最终您会使他们失败。请注意,如果您获得的nim分数高于0
的职位,您总是可以找到使他人得分0
的举动(如果无法获得该分数) 0
,那么您的nim分数将是0
)。因此,如果给您一个得分为0
的职位,并且其他人打得正确,那么您总是会得到0
的得分,最终我们输了。
现在,这是有关加法游戏的基本结果。如果您可以计算多个塔的每一个的Nim分数,则组合的Nim分数就是各个Nim分数的xor
。
这是前几个nim得分。
0: 0 (you just lost)
1: 1 (nim(1-1) = 0)
2: 2 (nim(2-2) = 0, nim(2-1) = 1)
3: 3 (nim(3-3) = 0, nim(3-2) = 1, nim(3-1) = 2)
4: 4 (nim(4-4) = 0, nim(4-3) = 1, nim(4-2) = 2, nim(4-1) = 3)
5: 5 (nim(5-5) = 0, nim(5-4) = 1, nim(5-3) = 2, nim(5-2) = 3, nim(5-1) = 4)
6: 0 (can't get 0)
7: 1 (nim(7-7) = 0)
8: 2 (nim(8-8) = 0, nim(8-7) = 1)
9: 3 (nim(9-9) = 0, nim(9-8) = 1, nim(9-7) = 2)
10: 4 (nim(10 - 4) = 0, nim(10-9) = 2, nim(10-8) = 2, nim(10-7) = 3)
以此类推。很容易递归计算。记住,它将是O(n**2 / log(n))
(对于每个n
个数字,构造在所有O(n / log(n))
个可能的移动之后可能达到的nim值集,然后从{{1}开始计数},直到找到不超过0
个可能的值之后,您才发现第一个无法实现的值。)
要实际播放它,您不仅应该存储塔的nim分数,还应该查找如何获取可以从中获得的所有更好的nim值的查询。在单塔式游戏中,您可以立即知道如何玩。在多塔版本中,它稍微复杂一些。当您获得的Nim分数非零的位置时,您应该寻找一个Nim分数在分数的前两位数字中为1的塔。您希望与该塔一起移动,以使其新的nim得分成为其他塔的异或。新分数将始终小于其当前的nim分数,因此您可以移动并递回0分数。
答案 1 :(得分:0)
我找到了另一种解决方案- 您需要始终将塔中的数字模6等于0,以使竞争对手无法获得立方的素数(或素数的幂)。
对于2个塔,您需要两个塔的模数相等,这意味着它们的6模数必须相同。