您遇到了SPOJ上的问题(http://www.spoj.com/problems/QCJ3/)。 我试图将此问题映射到Grundy数字,然后映射到Sprague-Grundy + NIM桩。 我可以推断出以下内容......
如果任何位置/位置(1,2,3,4 ......)只放置偶数硬币,则第一位玩家总是会失去。
如果奇数硬币只放在任何地方的1个位置,甚至硬币放在第一个玩家获胜的任何地方。
根据放置在位置(1,2,3,... k-1)的硬币,硬币在第K个位置的移动可以达到任何(下一个)状态,具体取决于放入的硬币数量以前的职位。我发现难以映射到Grundy Numbers + Sprague-Grundy + NIM桩。
***我确实看到了一个代码,通过执行XOR(放置奇数硬币的位置)来达到解决方案。如果这种方法产生正确的结果(当然我没有提交,因为我不明白“为什么?”)这种方法背后的逻辑是什么。
答案 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。
一个简单的实现:
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");