[poj2311]Cutting Game_博弈论

Cutting Game poj-2311

题目大意题目链接

注释:略。


想法

我们发现一次操作就是将这个ICG对应游戏图上的一枚棋子变成两枚。

又因为SG定理的存在,记忆化搜索即可。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 250  
using namespace std;
bool vis[N]; int sg[N][N];
int n,m;
int dp(int x,int y)
{
	if(sg[x][y]!=-1) return sg[x][y];
	memset(vis,false,sizeof vis);
	for(int i=2;i<=x-i;++i) vis[dp(i,y)^dp(x-i,y)]=1;
	for(int i=2;i<=y-i;++i) vis[dp(x,i)^dp(x,y-i)]=1;
	for(int i=0;;i++) if(!vis[i]) {sg[x][y]=i; return i;}
}
int main()
{
	memset(sg,-1,sizeof sg);
	sg[2][2]=sg[2][3]=sg[3][2]=0;
	while(scanf("%d%d",&n,&m)==2)
	{
		if(dp(n,m)) puts("WIN");
		else puts("LOSE");
	}
	return 0;
}
/*7
2 2
3 2
4 2
*/

小结:SG定理应用极为广泛。

猜你喜欢

转载自www.cnblogs.com/ShuraK/p/9614586.html