題目大意:
從右上角出發一直到左下角,每次左移,下移或者左下移,到達左下角的人獲勝
到達左下角為必勝态,那麼到達它的所有點都為必敗态,每個點的局勢都跟左,下,左下三個點有關
開始寫了一個把所有情況都計算的打表
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 }
轉載于:https://www.cnblogs.com/CSU3901130321/p/4251621.html