天天看點

HDU 2147 找規律博弈

題目大意:

從右上角出發一直到左下角,每次左移,下移或者左下移,到達左下角的人獲勝

到達左下角為必勝态,那麼到達它的所有點都為必敗态,每個點的局勢都跟左,下,左下三個點有關

開始寫了一個把所有情況都計算的打表

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