这里是第二关啦——规则反过来
上面所说的SG函数的一个重要前提就是当一个玩家没有操作的时候他输,但如果当这个人没有操作的时候判赢,就不能简单地用SG函数来求解了。虽然NP态理论还是成立的,但SG函数证明正确性的大前提没有了。
这类Anti-SG游戏的一个通用定理——SJ定理:
对于任意一个 Anti-SG 游戏,如果我们规定当局面中所有的单一游戏的 SG 值为 0 时,游戏结束,则先手必胜当且仅当:
(1)游戏的 SG 函数不为0且游戏中某个单一游戏的 SG 函数大于 1;
(2)游戏的 SG 函数为0且游戏中没有单一游戏的 SG 函数大于 1。
有了这个定理,所有Anti_SG游戏就可以直接求出SG函数然后用上面的定理判断了。求SG函数的过程和普通的博弈题的做法是一样的。
题目:
[BZOJ1022] [SHOI2008] John
[HDU2509] Be the Winner
题解:
我会告诉你上面的两道题是一道题?
只要按照上面说的做就行了?
代码:
#include <cstdio>
using namespace std;
int a[55];
int main()
{
int T,n;
scanf("%d",&T);
while (T--)
{
int k=0,z=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]),k^=a[i];
if (a[i]>1) z++;
}
if ((k && z>=1) || (!k && !z)) printf("John\n");else printf("Brother\n");
}
}