题目描述
AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你一个n*20的棋盘,以及棋盘上有若干个棋子,问谁赢?akn先手!
游戏规则是这样的:
对于一个棋子,能将它向右移动一格,如果右边有棋子,则向右跳到第一个空格,如果右边没有空格,则不能移动这个棋子,如果所有棋子都不能移动,那么将输掉这场比赛。
输入格式
第一行一个T,表示T组数据
每组数据第一行n,表示n*20的棋盘
接下来n行每行第一个数m表示第i行有m个棋子
随后跟着m个数pj表示第i行的棋子布局
输出格式
如果AKN能赢,则输出”YES”,否则输出”NO”
输入输出样例
输入 #1 复制
2
1
2 19 20
2
1 19
1 18
输出 #1 复制
NO
YES
说明/提示
10%的数据T≤1,n≤1
另外10%的数据m≤1
100%的数据T≤100,n≤1000,m≤20,1≤pj≤20
By:Mul2016
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int SG[30],a[30],fz[1000];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
int t,n;cin>>t;int a[30],cnt[30];
while(t--)
{
cin>>n;
int ans=0;
for(int i=1;i<=n;++i)
{
int len;
memset(cnt,0,sizeof cnt);
cin>>len;
for(int i=1;i<=len;++i)
cin>>a[i],cnt[a[i]]++;
int tot=0,i=20,fg=0;
while(cnt[i])--i;
for(;i;--i)
{
if(!cnt[i])ans^=(fg?tot:0),fg^=1,tot=0;
else ++tot;
}
ans^=(fg?tot:0);
}
cout<<(ans?"YES":"NO")<<endl;
}
return 0;
}