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;
}

 

posted @ 2012-12-07 13:22  _hikaru__  阅读(194)  评论(0编辑  收藏  举报