51nod 1851俄罗斯方块(trick)

Posted Saurus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1851俄罗斯方块(trick)相关的知识,希望对你有一定的参考价值。

题目大意:给出一个黑白图,你可以选定一个俄罗斯方块的区域,黑白翻转,问能否变成白图

 

 

比较trick的题目,

首先可以想到,奇数个1肯定是无解的,所以考虑偶数个1

可以先讨论n是2的情况

当n为2时,其实除了m也等于2时需要特判外,都是可行的(因为你可以不断地往右侧推进,最后变成4个1)

所以n为偶数也是可行的

n为奇数时,可以把奇数行的1变到偶数行,所以也是可行的

最后就讨论n是1的情况,这个贪心往右侧走即可

(以及掌握了读入的优化技巧)

 

#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;
        }
    }
}

 

以上是关于51nod 1851俄罗斯方块(trick)的主要内容,如果未能解决你的问题,请参考以下文章

51单片机俄罗斯方块游戏+Proteus在线模拟仿真

51nod1519拆方块[Codeforces](dp)

51Nod1519 拆方块 贪心+递推

JAVA课程设计——俄罗斯方块(团队)

java的俄罗斯方块代码

求用JAVA编写俄罗斯方块游戏的源代码