HDU 5724 Chess(博弈论)

时间:2022-08-27 09:46:20

【题目链接】 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(博弈论)的更多相关文章

  1. HDU 5724 Chess(国际象棋)

    HDU 5724 Chess(国际象棋) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  2. HDU 5724 Chess (sg函数)

    Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5724 Description Alice and Bob are playing a s ...

  3. HDU 5724 Chess(SG函数&plus;状态压缩)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5724 题意: 现在有一个n*20的棋盘,上面有一些棋子,双方每次可以选择一个棋子把它移动到其右边第一 ...

  4. hdu 5724 Chess 博弈sg&plus;状态压缩

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem De ...

  5. HDU 5724 Chess(SG函数)

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  6. HDU 5724 Chess &lpar;状态压缩sg函数博弈&rpar; 2016杭电多校联合第一场

    题目:传送门. 题意:有n行,每行最多20个棋子,对于一个棋子来说,如果他右面没有棋子,可以移动到他右面:如果有棋子,就跳过这些棋子移动到后面的空格,不能移动的人输. 题解:状态压缩博弈,对于一行2^ ...

  7. HDU 5724 - Chess

    题意:    一个n行20列的棋盘. 每一行有若干个棋子.     两人轮流操作, 每人每次可以将一个棋子向右移动一个位置, 如果它右边有一个棋子, 就跳过这个棋子, 如果有若干个棋子, 就将这若干个 ...

  8. hdu 5724 Chess 博弈

    题目链接 一个n行20列的棋盘. 每一行有若干个棋子. 两人轮流操作, 每人每次可以将一个棋子向右移动一个位置, 如果它右边有一个棋子, 就跳过这个棋子, 如果有若干个棋子, 就将这若干个都跳过. 但 ...

  9. HDU 5724:Chess(博弈 &plus; 状压)

    http://acm.hdu.edu.cn/showproblem.php?pid=5724 Chess Problem Description   Alice and Bob are playing ...

随机推荐

  1. 在PowerShell中使用curl&lpar;Invoke-WebRequest&rpar;

    前言 习惯了windows的界面模式就很难转去命令行,甚至以命令行发家的git也涌现出各种界面tool.然而命令行真的会比界面快的多,如果你是一个码农. situation:接到需求分析bug,需要访 ...

  2. shell 命令集

    shell 常用知识点--------------------------------------- sed 用法 http://www.cnblogs.com/edwardlost/archive/ ...

  3. sql server数据库语句

    -- 3-5  创建表Studnetcreate table Student(Sno char(9) primary key,Sname char(20) UNIQUE,Ssex CHAR(2),Sa ...

  4. BZOJ2302 &lbrack;HAOI2011&rsqb;Problem c

    Description 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了, ...

  5. 各种数据库的批量插入操作&lowbar;Oracle

    最近工作中需要优化以前各种的Excel批量导入功能,目前将能优化的方面做个记录. 选用技术: 目前.Net可以访问Oracle常用的Dll,有三种: 微软自带的 System.Data.OracleC ...

  6. Effective C&plus;&plus; 第二版 8&rpar; 写operator new 和operator delete 9&rpar; 避免隐藏标准形式的new

    条款8 写operator new 和operator delete 时要遵循常规 重写operator new时, 函数提供的行为要和系统缺省的operator new一致: 1)正确的返回值; 2 ...

  7. iOS之RunLoop

    RunLoop是iOS线程相关的比较重要的一个概念,无论是主线程还是子线程,都对应一个RunLoop,如果没有RunLoop,线程会马上被系统回收. 本文主要CFRunLoop的源码解析,并简单阐述一 ...

  8. Struts2-046验证脚本

    下面分享一下Struts2-046验证的python脚本 #encoding:utf-8 import urllib2 from poster.encode import multipart_enco ...

  9. Android 9&period;0适配遇到的问题1

    文章同步自javaexception 本周在适配Android 9.0,过程中碰到了小问题 问题1: SSL handshake timed out 解决办法: Android 9.0 开始,默认不允 ...

  10. CSS特例定位方式

    同级向下一个元素定位,一个+表示下一个元素,++表格下下个元素 input[name='name1'] +input td:eq(0)表示第一个td元素,此定位方式限于执行js,在selenium时用 ...