題目大意:給出一個黑白圖,你能夠選定一個俄羅斯方塊的區域,黑白翻轉,問可否變成白圖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; } } }