码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-29 23:59:28      阅读:1663      评论:0      收藏:0      [点我收藏+]

标签:==   const   code   queue   getc   oid   mat   取出   put   

这个题一看就是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\n");
        else
        printf("YES\n");
    }
    return 0;
}

 

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

标签:==   const   code   queue   getc   oid   mat   取出   put   

原文地址:https://www.cnblogs.com/DukeLv/p/9727048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!