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