题目大意:

从右上角出发一直到左下角,每次左移,下移或者左下移,到达左下角的人获胜

 

到达左下角为必胜态,那么到达它的所有点都为必败态,每个点的局势都跟左,下,左下三个点有关

开始写了一个把所有情况都计算的打表

for(int i=n ; i>=1 ; i--){
            for
(int j=1 ; j<=m ; j++){
                bool
flag1 = p[i][j-1];
                bool
flag2 = p[i+1][j];
                bool
flag3 = p[i+1][j-1];
                if
(flag1 || flag2 || flag3) p[i][j] = false;
                else
p[i][j] = true;
            }
        }

但貌似因为样例太多就超时了

根据自己所打的表画个表格标注当前格子的状态就很容易找到规律

任意两个必胜态的行差和列差都是2的倍数

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 #define N 2005
 5 bool p[N][N];
 6 
 7 int main()
 8 {
 9    // freopen("a.in" , "r" , stdin);
10     int n,m;
11     while(scanf("%d%d" , &n , &m) , n||m)
12     {
13         if((m-1)&1 || (n-1)&1) puts("Wonderful!");
14         else puts("What a pity!");
15     }
16     return 0;
17 }

 

 posted on 2015-01-26 23:11  Love风吟  阅读(268)  评论(0编辑  收藏  举报