如何找到哪个球员将获胜

时间:2012-04-21 11:16:12

标签: algorithm

两位玩家玩下面的游戏。在比赛开始时,他们从n(1 <= n <= 100000)堆石头开始。在游戏的每个步骤中,玩家选择一堆并从该堆中移除至少一块石头并将该堆中的零个或多个石块移动到仍然具有石块的任何其他堆。如果一个球员没有更多可能的动作,他就输了。鉴于最初的桩,确定谁赢了:第一个球员,或第二个球员,如果两者都完美地发挥。

2 个答案:

答案 0 :(得分:1)

这是Nim的变体。了解Nim的解决方案应该可以帮助您更好地理解这个游戏。

对于Nim,游戏以n成堆的石头开始。反过来,每个玩家选择一个桩并从堆中移除至少一个,可能更多的石头。当没有剩余的石头时,游戏结束。

上面链接的维基百科文章对获胜策略有一个很好的解释,它涉及计算桩尺寸的二进制数字和。阅读,你应该能够解决这个变种。

答案 1 :(得分:0)

首先从分析已知结果的位置开始 - 当所有石头都在一堆时就是这种情况。然后你没有至少有一块石头的其他堆,所以你不能执行移动的第二部分(这假设即使你移动0石头仍然必须是另一个非空堆)所以这是失去位置。

现在开始分析你可以从哪些位置到达失去的位置。这将是你的第一轮胜利阵地。

首先观察:由于移动只会影响两个桩,很明显只有当你有两个桩时才可以到达松动位置。如果你只有两个桩,你总是可以通过从其中一个中移除所有的石头来到达失去的位置,因此这是一个获胜的位置。

所以现在你必须考虑哪些位置迫使你采取行动带你到找到的胜利位置。这些也将失去位置(提示:我相信这只是你有3桩,每块1石)的情况。

继续这种方式,最后你会得出最终的解决方案。我不想为你解决整个问题,因为这对你的技能没有好处。最好自己提出解决方案。

希望这有帮助。

注意:如果你被允许在一个非空堆上进行操作,即如果移动零石头你不需要另一个非空堆,那么最初的失去位置就是当你没有剩下的石头时在所有和最初的获胜位置是你只有一堆有任意数量的石头。