博弈问题总集第二类----Anti-Nim

来源:互联网 发布:建立网络共享 编辑:程序博客网 时间:2024/06/05 23:43

这里是第二关啦——规则反过来

上面所说的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");    }}
原创粉丝点击