Input Multiple test cases. The first line contains an integer T(T≤100), indicates the number of test cases.For each test case, the first line contains a single integer n(n≤1000), the number of lines of chessboard.Then n lines, the first integer of ith line is m(m≤20), indicates the number of chesses on the ith line of the chessboard. Then m integers pj(1≤pj≤20)followed, the position of each chess.
Output For each test case, output one line of “YES” if Alice can win the game, “NO” otherwise.
Sample Input 2 1 2 19 20 2 1 19 1 18
Sample Output NO YES
Author HIT 将棋盘的状态压缩,然后预处理出所有状态的sg值,然后就是普通的组合游戏做法了。 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int sg[(1<<20) + 1010]; int vis[1010]; void init(int x) { sg[1] = 0; memset(vis, 0, sizeof(vis)); for(int i = 20; i >= 0; i--) { if((1 << i) & x) { for(int j = i - 1; j >= 0; j--) { if(!((1 << j) & x)) { vis[sg[x ^ (1 << j) ^ (1 << i)]] = 1; break; } } } for(int j = 0; ; j++) if(!vis[j]) { sg[x] = j; break; } } } int main() { int t; for(int i = 0; i < (1 << 20); i++) init(i); scanf("%d", &t); while(t--) { int n, m; scanf("%d", &n); int ans = 0; for(int i = 1; i <= n; i++) { scanf("%d", &m); int tmp = 0; for(int j = 1; j <= m; j++) { int x; scanf("%d", &x); tmp ^= 1 << (20 - x); } ans ^= sg[tmp]; } if(ans) puts("YES"); else puts("NO"); } }
转载于:https://www.cnblogs.com/lonewanderer/p/5690581.html