ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

POJ 2311 Cutting Game 题解

2021-05-29 12:33:36  阅读:224  来源: 互联网

标签:局面 210 int 题解 times leq Game Cutting SG


前置芝士

Cutting Game

给定一张 \(N\times M\) 的矩形网格纸,两名玩家轮流行动。

在每一次行动中,可以任选一张矩形网格纸,沿着某一行或某一列的格线,把它剪成两部分。

首先剪出 \(1\times 1\) 的格纸的玩家获胜。

两名玩家都采取最优策略行动,求先手是否能获胜。

\(2\leq N,M\leq 200\)。

题目链接:POJ 2311 Cutting GameACWing 219. 剪纸游戏

Solution

最后终止条件为剪出 \(1\times 1\) 的获胜,不符公平组合游戏中的 "终止的局面为必败点" 的性质,但可以转化终止的局面,使得终止的局面为必败点。

能剪出 \(1\times 1\) 的纸片当且仅当当前为 \(1\times x\) 或 \(x\times 1,x>1\) 的纸片,这些纸片一定是必败点。

那么把终点定义成当前局面为 \(1\times x\) 或 \(x\times 1,x>1\),就满足了公平组合游戏的性质。

设 \(SG(x,y)\) 为 \(x\times y\) 的局面的 SG 函数值。一刀可以横着切也可以竖着切,切完一刀后是分成了两个局面,由 SG 定理,如果这样切当前 SG 函数的值就为分成的两个局面的 SG 函数值的异或值。

所以有:

\[SG(x,y)=\text{mex}(\{SG(i,y)\oplus SG(x-i,y)\mid 2\leq x-2\}\cup \{SG(x,i)\oplus SG(x,y-i)\mid 2\leq i\leq y-2\}) \]

注意到 \(SG\) 不会超过 \(N,M\),则可以在 \(\mathcal{O}(N^3)\) 的复杂度内求解,也就是 \(\mathcal{O}(N^2)\) 枚举,单次 \(\mathcal{O}(N)\) 转移。

Code
int n, m;
int SG[210][210], vis[210];
void pre() {
	for(int x = 2; x <= 200; ++x)
		for(int y = 2; y <= 200; ++y) {
			for(int i = 0; i <= 200; ++i) vis[i] = 0;
			for(int i = 2; x - i >= 2; ++i) vis[SG[i][y] ^ SG[x-i][y]] = 1;
			for(int i = 2; y - i >= 2; ++i) vis[SG[x][i] ^ SG[x][y-i]] = 1;
			for(int i = 0; i <= 200; ++i)
				if(!vis[i]) {
					SG[x][y] = i;
					break;
				}
		}
}
signed main() {
	pre();
	while(scanf("%d%d", &n, &m) != EOF)
		printf("%s\n", SG[n][m] == 0 ? "LOSE" : "WIN");
	return 0;
}

标签:局面,210,int,题解,times,leq,Game,Cutting,SG
来源: https://www.cnblogs.com/do-while-true/p/14824958.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有