Binary Matrix Transform

Binary Matrix Transform

样例输入 1 

3
2 3 1 1
000
000
011
110
2 3 1 1
000
000
111
111
2 3 2 1
000
000
111
111
样例输出 1

Yes
Yes
No
样例解释 1

对于第11个样例,你可以先选择(1,2)(1,2)和(1,3)(1,3),然后再选择(2,1)(2,1)和(2,2)(2,2)。

对于第22个样例,你可以先选择(1,1)(1,1)和(1,2)(1,2),然后选择(2,1)(2,1)和(2,2)(2,2),最后选择(1,3)(1,3)和(2,3)(2,3)。

对于第33个样例,你不管怎么操作都无法从AA变成BB。
Binary Matrix Transform

#include<bits/stdc++.h>
using namespace std;

bool ok(bool d[], int h, int w) {
    return accumulate(d, d + h * w, 0) % 2 == 0;
}

bool ok() {
    int h, w, r, c;
    scanf("%d%d%d%d", &h, &w, &r, &c);
    static char b[1<<20];
    static bool d[1<<20];
    for (int i = 0, k = 0; i <h; ++i) {
        scanf(" %s", b);
        for (int j = 0; j < w; ++j, ++k) d[k] = (b[j] & 1);
    }
    for (int i = 0, k = 0; i <h; ++i) {
        scanf(" %s", b);
        for (int j = 0; j < w; ++j, ++k) d[k] ^= (b[j] & 1);
    }
    for (int sr = 0; sr < r; ++sr)
        for (int sc = 0; sc < c; ++sc) {
            bool* x = reinterpret_cast<bool*>(b);
            const int h2 = (h + r - 1 - sr) / r, w2 = (w + c - 1 - sc) / c;
            for (int i = sr, u = 0 ; i < h; ++u, i += r)
                for (int j = sc, v = 0;j < w; ++v, j += c)
                    x[u * w2 + v] = d[i * w + j];
            if (!ok(x, h2, w2))
                return false;
        }
    return true;
}


int main() {
    int T;
    scanf("%d", &T);
    for (int i = 0; i < T; ++i) puts(ok() ?  "Yes":"No");
}
上一篇:conda新建环境错误 CondaHTTPError: HTTP 000 CONNECTION FAILED for url


下一篇:Python基础教程(第3版)读书笔记:第3章 使用字符串