SPOJ QCJ3(Grundy-Sprague + NIM)

时间:2015-05-01 19:08:56

标签: algorithm

您遇到了SPOJ上的问题(http://www.spoj.com/problems/QCJ3/)。 我试图将此问题映射到Grundy数字,然后映射到Sprague-Grundy + NIM桩。 我可以推断出以下内容......

  1. 如果任何位置/位置(1,2,3,4 ......)只放置偶数硬币,则第一位玩家总是会失去。

  2. 如果奇数硬币只放在任何地方的1个位置,甚至硬币放在第一个玩家获胜的任何地方。

  3. 根据放置在位置(1,2,3,... k-1)的硬币,硬币在第K个位置的移动可以达到任何(下一个)状态,具体取决于放入的硬币数量以前的职位。我发现难以映射到Grundy Numbers + Sprague-Grundy + NIM桩。

  4. ***我确实看到了一个代码,通过执行XOR(放置奇数硬币的位置)来达到解决方案。如果这种方法产生正确的结果(当然我没有提交,因为我不明白“为什么?”)这种方法背后的逻辑是什么。

2 个答案:

答案 0 :(得分:0)

在位置x处使用单个硬币考虑游戏。

这与使用大小为x的堆播放Nim相同。

现在整个游戏可以被视为一组游戏,每个游戏一个。 Sprague-Grundy理论有一个标准结果,即一组游戏的价值是各个游戏价值的异或。

换句话说,这个游戏相当于Nim,你在x位置的每个硬币都有一堆x大小。解释了Nim的XOR解决方案here

答案 1 :(得分:0)

此问题映射到NIM,因此使用XOR解决,因为这是NIM的解决方案: http://www.scribd.com/doc/61249180/Game-Theory-Intro-Ak#scribd

  

想法:位置P处的每块石头对应于NIM中的大小为P的堆   
  r = x ^ x ^ x ^ x。 。 。 。 。 ^ x(n次)   
    - n even:r = 0
    - n odd:r = x

在这种方法中,如果位置 n 处有 x 个宝石,那么 n 会被异或 x 次因为每块石头对应的堆大小为n。

  • 偶数次的XOR等于零。
  • 奇数次的XOR等于它自己。

一个简单的实现:

scanf("%d",&n);
r=0; 
for(i=1;i<=n;i++)
{
    scanf("%d",&x);
    if(x&1) r ^= i;
}
puts(r==0?"Hanks Wins":"Tom Wins");