51nod 1851俄羅斯方塊(trick)

題目大意:給出一個黑白圖,你能夠選定一個俄羅斯方塊的區域,黑白翻轉,問可否變成白圖ios

 

 

比較trick的題目,優化

首先能夠想到,奇數個1確定是無解的,因此考慮偶數個1spa

能夠先討論n是2的狀況code

當n爲2時,其實除了m也等於2時須要特判外,都是可行的(由於你能夠不斷地往右側推動,最後變成4個1)blog

因此n爲偶數也是可行的ci

n爲奇數時,能夠把奇數行的1變到偶數行,因此也是可行的get

最後就討論n是1的狀況,這個貪心往右側走便可string

(以及掌握了讀入的優化技巧)io

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T, n, m;
int str[10000005];
int read01() {
    char c = getchar();
    for(; c != '0' && c != '1'; c = getchar());
    return c - '0';
}
int main() {
    cin>>T;
    while(T--) {
        scanf("%d %d", &n, &m);
        int ans = 0;
        if(n == 1 || m == 1) {
            n = (n > m ? n : m);
            for(int i = 0; i < n; i++)
                str[i] = read01();
            for(int i = 0; i < n-3; i++)
                if(str[i]) {
                    str[i] ^= 1;
                    str[i+1] ^= 1;
                    str[i+2] ^= 1;
                    str[i+3] ^= 1;
                }
            int f = 0;
            for(int i = 0; i < n; i++) if(str[i])  f = 1;
            if(f) cout<<"No"<<endl;
            else cout<<"Yes"<<endl;
            continue;
        }
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)
                ans += read01();
        if(ans&1) cout<<"No"<<endl;
        else {
            if(n == 2 && m == 2) {
                if(ans == 4 || ans == 0) cout<<"Yes"<<endl;
                else cout<<"No"<<endl;
                continue;
            }
            cout<<"Yes"<<endl;
        }
    }
}
相關文章
相關標籤/搜索