ACM2016多校联赛1B hdu5724 Chess(博弈)
2016-07-21 10:50
176 查看
感谢围巾师兄,不然完全想不到。
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1006 Accepted Submission(s): 439
Problem Description
Alice and Bob are playing a special chess game on an n × 20 chessboard. There are several chesses on the chessboard. They can move one chess in one turn. If there are no other chesses on the right adjacent block of the moved chess, move the chess to its right
adjacent block. Otherwise, skip over these chesses and move to the right adjacent block of them. Two chesses can’t be placed at one block and no chess can be placed out of the chessboard. When someone can’t move any chess during his/her turn, he/she will lose
the game. Alice always take the first turn. Both Alice and Bob will play the game with the best strategy. Alice wants to know if she can win the game.
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
Source
2016 Multi-University Training Contest 1
思路:每一行有2^20种情况嘛,有或没有,用状态压缩把每一种情况的sg值算出来。
然后把每一行的sg亦或起来就可以了。
上代码加注释吧,不懂的地方请留言,天天在线可以及时回复。
Chess
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1006 Accepted Submission(s): 439
Problem Description
Alice and Bob are playing a special chess game on an n × 20 chessboard. There are several chesses on the chessboard. They can move one chess in one turn. If there are no other chesses on the right adjacent block of the moved chess, move the chess to its right
adjacent block. Otherwise, skip over these chesses and move to the right adjacent block of them. Two chesses can’t be placed at one block and no chess can be placed out of the chessboard. When someone can’t move any chess during his/her turn, he/she will lose
the game. Alice always take the first turn. Both Alice and Bob will play the game with the best strategy. Alice wants to know if she can win the game.
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
Source
2016 Multi-University Training Contest 1
思路:每一行有2^20种情况嘛,有或没有,用状态压缩把每一种情况的sg值算出来。
然后把每一行的sg亦或起来就可以了。
上代码加注释吧,不懂的地方请留言,天天在线可以及时回复。
//http://acm.hdu.edu.cn/showproblem.php?pid=5724 //Chess #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=(1<<21); int sg[maxn]; bool vis[25]; int getsg(int x) { memset(vis,false,sizeof(vis)); for(int i=20;i>=0;i--) { if(x&(1<<i))//判断该位置是否存在棋子 { int temp=x; for(int j=i-1;j>=0;j--)//找到右边第一个为空的位置 { if(!(x&(1<<j))) { vis[sg[temp^=(1<<j)^(1<<i)]]=true;//sg函数公式 break;//一定要break 因为只能最多到达右边第一个为空的位置 } } } } int ans=0; while(vis[ans])ans++; return ans; } int main() { for(int i=0;i<(1<<20);i++)sg[i]=getsg(i); int T,n,m,t; scanf("%d",&T); while(T--) { int res=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&m); int ans=0; for(int j=1;j<=m;j++) { scanf("%d",&t); ans|=(1<<20-t); } res=res^sg[ans]; } if(res)cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002