HDU 5724 Chess(博弈论)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5724
【题目大意】
给出一个n行,每行有20格的棋盘,棋盘上有一些棋子,每次操作可以选择其中一个棋子,将其移至最左端的空位,两个人轮流操作,无法操作者输,判断游戏胜负。
【题解】
首先对于单行20格的游戏,这是一个NIM游戏,将20格的情况状态压缩,对于每种情况递归求其mex集合,计算其sg值,sg值为0的状态为必败态。
而对于可以拆分为多组NIM游戏的游戏,其sg值为拆分出的多组游戏的sg值的异或和。
预处理所有状态的sg值,对于每种读入的棋盘情况,直接求出解即可。
【代码】
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1<<20;
int sg[N],T,n,m,x;
int dfs(int x){
if(sg[x]!=-1)return sg[x];
int mex[50]={0},pos=-1;
for(int i=0;i<20;i++){
if((x&(1<<i))==0)pos=i;
else if(pos!=-1)mex[dfs(x^(1<<i)|(1<<pos))]=1;
}for(int i=0;i<N;i++)if(!mex[i])return sg[x]=i;
}
void init(){
memset(sg,-1,sizeof(sg));
for(int i=0;i<=20;i++)sg[(1<<i)-1]=0;
for(int i=1;i<N;i++)dfs(i);
}
int main(){
init();
scanf("%d",&T);
while(T--){
int SG=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&m);
int tmp=0;
for(int j=1;j<=m;j++)scanf("%d",&x),tmp|=(1<<(20-x));
SG^=sg[tmp];
}if(SG)puts("YES");
else puts("NO");
}return 0;
}
HDU 5724 Chess(博弈论)的更多相关文章
- HDU 5724 Chess(国际象棋)
HDU 5724 Chess(国际象棋) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 5724 Chess (sg函数)
Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5724 Description Alice and Bob are playing a s ...
- HDU 5724 Chess(SG函数+状态压缩)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5724 题意: 现在有一个n*20的棋盘,上面有一些棋子,双方每次可以选择一个棋子把它移动到其右边第一 ...
- hdu 5724 Chess 博弈sg+状态压缩
Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem De ...
- HDU 5724 Chess(SG函数)
Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 5724 Chess (状态压缩sg函数博弈) 2016杭电多校联合第一场
题目:传送门. 题意:有n行,每行最多20个棋子,对于一个棋子来说,如果他右面没有棋子,可以移动到他右面:如果有棋子,就跳过这些棋子移动到后面的空格,不能移动的人输. 题解:状态压缩博弈,对于一行2^ ...
- HDU 5724 - Chess
题意: 一个n行20列的棋盘. 每一行有若干个棋子. 两人轮流操作, 每人每次可以将一个棋子向右移动一个位置, 如果它右边有一个棋子, 就跳过这个棋子, 如果有若干个棋子, 就将这若干个 ...
- hdu 5724 Chess 博弈
题目链接 一个n行20列的棋盘. 每一行有若干个棋子. 两人轮流操作, 每人每次可以将一个棋子向右移动一个位置, 如果它右边有一个棋子, 就跳过这个棋子, 如果有若干个棋子, 就将这若干个都跳过. 但 ...
- HDU 5724:Chess(博弈 + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5724 Chess Problem Description Alice and Bob are playing ...
随机推荐
- SQL Server 向堆表中插入数据的过程
堆表中 IAM 记录着的数据页,表的各个数据页之间没有联系.也就是说一个页面它不会知道自己的前一页是谁,也不知道自己的后一页是谁. 插入数据时先找到IAM页,再由pfs(page free spac ...
- ReentrantLock(重入锁)以及公平性
ReentrantLock(重入锁)以及公平性 标签(空格分隔): java NIO 如果在绝对时间上,先对锁进行获取的请求一定被先满足,那么这个锁是公平的,反之,是不公平的,也就是说等待时间最长的线 ...
- silverlight datagrid绑定匿名类
原文 http://www.cnblogs.com/luweis/archive/2011/10/21/2220587.html 刚开始遇到的一个问题是这样的,我有一个datagrid,根据不同的条件 ...
- ProcessBuilder 和 Runtime(转)
ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例,该实例可用来控制进程状态并获 ...
- nova的wsgi介绍【WIP】
有关openstack的所有的帖子. https://www.ustack.com/blog/openstack_hacker/#Nova_Workflow 网上已经很多的分析文章了: http:// ...
- Openstack service default port
Block Storage (cinder) 8776 publicurl and adminurl Compute API (nova-api) 8773 EC2 API 8774 openstac ...
- Emotional Mastery——英语学习小技巧之一
How can we control or manage our emotion ,so that we feel better and feel stronger when we're learni ...
- JAVA Layout
/** * baidu :组件不会直接放到框架上,而是放在若干个面板上,这些面板再放到窗格上? * 实际上在JFrame上可直接添加Jbutton * * BorderLayout Flow ...
- SendMessage用法实例
转: http://blog.csdn.net/coolszy/article/details/5523700 SendMessage用法 windowsbuttonmenucommandlistc# ...
- gridview合并相同的行
#region 方法:合并Gridview行 /// <summary> /// 合并GridView指定行单元格 /// </summary> /// ...