B1299 [LLH邀请赛]巧克力棒 博弈论

Posted dukelv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B1299 [LLH邀请赛]巧克力棒 博弈论相关的知识,希望对你有一定的参考价值。

这个题一看就是nim游戏的变形。每次先手取出巧克力就是新建一个nim,但假如先手取一个为0的而且无论后手怎么取剩下的都无法为零就行了。然后用dfs跑。

题干:

Description

TBL和X用巧克力棒玩游戏。每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度。TBL先手两人轮流,无法操作的人输。 他们以最佳策略一共进行了10轮(每次一盒)。你能预测胜负吗?
Input

输入数据共20行。 第2i-1行一个正整数Ni,表示第i轮巧克力棒的数目。 第2i行Ni个正整数Li,j,表示第i轮巧克力棒的长度。
Output

输出数据共10行。 每行输出“YES”或“NO”,表示TBL是否会赢。如果胜则输出"NO",否则输出"YES"

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = 1 << 30;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
    char c;
    bool op = 0;
    while(c = getchar(), c < 0 || c > 9)
        if(c == -) op = 1;
    x = c - 0;
    while(c = getchar(), c >= 0 && c <= 9)
        x = x * 10 + c - 0;
    if(op) x = -x;
}
template <class T>
void write(T x)
{
    if(x < 0) putchar(-), x = -x;
    if(x >= 10) write(x / 10);
    putchar(0 + x % 10);
}
int n,sg[2020],a[2010],found;
void dfs(int x,int used,int now)
{
    if(x == n + 1)
    {
        if(!now && used > 0) found = 1;
        return;
    }
    dfs(x + 1,used,now);
    dfs(x + 1,used + 1,now ^ a[x]);
}
int main()
{
    int k = 10;
    while(k--)
    {
        memset(sg,-1,sizeof(sg));
        found = 0;
        read(n);
        duke(i,1,n)
        read(a[i]);
        dfs(1,0,0);
        if(found == 1)
        printf("NO
");
        else
        printf("YES
");
    }
    return 0;
}

 

以上是关于B1299 [LLH邀请赛]巧克力棒 博弈论的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1299[LLH邀请赛]巧克力棒 博弈+模拟

BZOJ1299: [LLH邀请赛]巧克力棒

BZOJ1299: [LLH邀请赛]巧克力棒(Nim游戏)

bzoj:1299: [LLH邀请赛]巧克力棒

2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛

2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码