白宫网站 wordpress,餐饮手机网站建设,商业空间展示设计,常州建设企业网站题意#xff1a; 一个 n * 20 的棋盘#xff0c;棋盘上有若干棋子#xff0c;Alice 和 Bob 轮流走#xff0c;每人每次可以选择任一行的一颗棋子向右移动到最近的一个空格 #xff1b;也就是说如果右边与它相邻的格子里没有棋子#xff0c;就移到右边与他相邻的格子去 一个 n * 20 的棋盘棋盘上有若干棋子Alice 和 Bob 轮流走每人每次可以选择任一行的一颗棋子向右移动到最近的一个空格 也就是说如果右边与它相邻的格子里没有棋子就移到右边与他相邻的格子去如果右边与它相邻的格子里 有棋子就跳过它们移到相邻的空格 一个空格只能放一颗棋子且不能够放出去。 双方都采取最优策略最后不能移动棋子的一方输 。 输入 第一行输入 t 表 t 组数据第二行输入 n 表示 棋盘有 n 行接下来 n 行每行包括 m 表示此行有 m 个棋子 和 m 个数棋子的位置 输出若 Alice 赢输出“YES” 否则“NO”。 解题 把它看成由 n 个子游戏组成的游戏 那么整个游戏的 sg 值就是所有子游戏的 sg 值异或起来。 用二进制表示每一行的游戏局面 。 写完这题 感觉对状态压缩又多了解了一点点~~ 写的时候SB了一下sg数组开小了 不造错哪又纠结了很久不过也因为这样想了很久这个问题印象更深刻 #includecstdio
#includecstring
#includealgorithm
#includeiostream
#includestring
using namespace std;
const int maxn 1050000;
int num[25],sg[maxn];
void getsg()
{for(int i1;i(120);i){int hash[50] {0}, r-1;for(int j0;j20;j){if( !((ij) 1)) r j;if( (ij) 1){if(r ! -1)hash[ sg[i ^ (1j) ^ (1r)]] 1;}}int j 0;while(hash[j]!0) j;sg[i] j; }
}
int main()
{int t,n,m,loc; getsg(); scanf(%d,t);while(t--){scanf(%d,n); int ans 0;for(int i0;in;i){scanf(%d,m); num[i] 0; for(int j0;jm;j){scanf(%d,loc);num[i] ^ (1(20-loc)); }ans ^ sg[ num[i] ];}printf(ans?YES\n:NO\n);}return 0;
} 转载于:https://www.cnblogs.com/ember/p/5720836.html