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