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

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

上面所说的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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值