[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定理应用极为广泛。

转载于:https://www.cnblogs.com/ShuraK/p/9614586.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值