POJ 2311 Cutting Game (博弈)】的更多相关文章

题意:给定一个长方形纸张,每次只能水平或者垂直切,如果切到1*1的方格就胜,问先手胜还是负. 析:根据Nim游戏可知,我们可以分别求出每个子游戏的和,就是答案,所以我们就枚举每一种切法,然后求出SG函数,那么就能得到答案. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib>…
Cutting Game 题意: 有一张被分成 w*h 的格子的长方形纸张,两人轮流沿着格子的边界水平或垂直切割,将纸张分割成两部分.切割了n次之后就得到了n+1张纸,每次都可以选择切得的某一张纸再进行切割.最先切出只有一个格子的纸张(即有 1*1 格子的)的一方获胜.当双方都采取最优策略时,先手必胜还是必败? 题解: 这题是小白书上的,在取得游戏中必胜策略的最后一题,我照着码一遍就叫了,结果居然T了,,最后发现是cin的问题,然后关下同步就可以a了,但好险用了913ms... 还有初始化mem…
Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4798   Accepted: 1756 Description Urej loves to play various types of dull games. He usually asks other people to play with him. He says that playing those games can show his e…
[题目链接] http://poj.org/problem?id=2311 [题目大意] 给出一张n*m的纸,每次可以在一张纸上面切一刀将其分为两半 谁先切出1*1的小纸片谁就赢了, [题解] 如果切出了一张1*n的纸条,那么下一步的人一定可以切出1*1的小纸片, 所以每次切只能切出长宽大于等于2的纸片,如果有人无法做到这一点就输了, 根据这种情况我们用记忆化搜索计算sg函数来得出答案. [代码] #include <cstdio> #include <set> #include…
Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4806   Accepted: 1760 Description Urej loves to play various types of dull games. He usually asks other people to play with him. He says that playing those games can show his e…
思路:求SG函数!! 代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; ][]; int getsg(int m,int n) { ) return sg[m][n]; ]; memset(vis,,sizeof(vis)); ;i<=m/;i++) vis[getsg(i,n)^getsg(m-i,n)]=;…
题目链接 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ][]; ]; int get_sg(int n,int m) { ) return sg[n][m]; ;i<=n-i;i++) vis[get_sg(i,m)^get_sg(n-i,m)]=; ;i<=m-i;i++) vis[get_sg(n,i)^get_sg(n,m-i)]=; ; ;i++…
传送门 题意:n*m的纸片,一次切成两份,谁先切出1*1谁胜 Multi-SG? 不太一样啊 本题的要求是后继游戏中任意游戏获胜就可以了.... 这时候,如果游戏者发现某一单一游戏他必败他就不会再玩了 $2*2,2*3,3*3$都不会再玩了(除非只剩下这样的纸片了),所以都可以认为是终止状态,必败 在此基础上按照Multi-SG递推就对了 #include <iostream> #include <cstdio> #include <algorithm> #includ…
题目描述 意思就是说两个人轮流剪纸片,直到有一个人剪出1*1的方格就算这个人赢了.然后给出纸片的长和宽,求先手会赢还是会输 (1<=n,m<=200) 题解 看了一眼,这不是裸的SG吗 啪啪啪写完,一交T了,居然没算复杂度就交了... 首先明确,把纸片分成两部分之后的SG是分成两个纸片的异或. 一个非常自然的想法就是,枚举如何分割这个纸片,然后求mex. 但是这样显然会T.(200^4) 其实作为一个正常人,1*x这样的纸片是不会切出来的,这显然是一个必败局面. 然后2*2,2*3,3*2这样…
题意: 有一张W*H的纸片. 每人每次可以横着撕或者竖着撕,先撕出1*1那一方胜. 数据范围: W and H (2 <= W, H <= 200) 思路: 很好抽象出游戏图的模型,用SG解决.直接看代码. 代码: int dp[maxn][maxn]; int sg(int w,int h){ if(dp[w][h]!=-1) return dp[w][h]; bool g[maxn]; mem(g,false); for(int i=2;i<=w/2;++i) g[sg(i,h)^s…