POJ 2311. Cutting Game
Link 题意: 给定一张 \(N*M(2 \le n,m \le 200)\) 的矩形网格纸,两名玩家轮流行动。 在每一次行动中,可以任选一张矩形网格纸,沿着某一行或某一列的格线,把它剪成两部分。 首先剪出 \(1*1\) 的格纸的玩家获胜。 两名玩家都采取最优策略行动,求先手是否能获胜。 思路: 得到 \(1*1\) ,除了会经过 \(1*n\) 和 \(n*1\) 这两种必胜局面外,一定会经过 \(2*2\) , \(2*3\) , \(3*2\) 这三种局面,而这三种局面往后必得到前两种必胜局面,所以这三种局面为必败局面 我们以这三种局面为最终局面进行递推 \(sg[i,j]=mex((sg[x,j] \bigoplus s[i-x,j])(2<=x<=i/2)\cup sg[i,x]\bigoplus s[i,j-x])(2<=x<=j/2))\) 代码: #include<iostream> #include<cstring> using namespace std; const int N=210; int sg[N][N]; bool vis[N]; int main() { //freopen("in.txt","r",stdin); ios::sync_with_stdio(false); cin.tie(0); memset(sg,-1,sizeof sg);