poj 2311
当子情况中只要存在P-position(先手必败)那么该情况一定是个N-position(即先手必胜)。如果所有的子情况都是N-position那么它一定是P-position.然后用异或来完成.
输入w,h。w*h的矩形,可水平和垂直切割。切出1*1的为胜者。
求SG函数值。
sg[w][h]=met{sg[i][h]^sg[w-i][h],sg[w][i]^sg[w][h-i]|i>=2};
包含所有w,h的后继结点的sg值。然后求met。
AC代码:
#include<stdio.h> #include<string.h> #define N 210 int sg[N][N],flag[N]; int getsg(int a,int b) { int i; if (sg[a][b]!=-1) return sg[a][b]; memset(flag,0,sizeof(flag)); for (i=2;i<=a-i;++i) { int aa=getsg(i,b); int bb=getsg(a-i,b); flag[aa^bb]=1; } for (i=2;i<=b-i;++i) { int aa=getsg(a,i); int bb=getsg(a,b-i); flag[aa^bb]=1; } for (i=0;flag[i];++i); sg[a][b]=sg[b][a]=i; return i; } int main () { int i,j,k; int w,h; memset(sg,-1,sizeof(sg)); sg[1][1]=0; for (i=2;i<N;++i) sg[1][i]=sg[i][1]=1; sg[2][2]=sg[2][3]=sg[3][2]=sg[3][3]=0; while (scanf("%d%d",&w,&h)!=EOF) { if (getsg(w,h)) printf("WIN\n"); else printf("LOSE\n"); } return 0; }