题目大意:
从右上角出发一直到左下角,每次左移,下移或者左下移,到达左下角的人获胜
到达左下角为必胜态,那么到达它的所有点都为必败态,每个点的局势都跟左,下,左下三个点有关
开始写了一个把所有情况都计算的打表
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 }