分析:假设n>=m,m为1,2单独讨论下,否则可以用第二行第一个把所有黑块搞到2x2的格子里,不断用凸出来的那个角一列一列把黑的变白就行了。然后只要黑色有偶数块都可以构造出来。复杂度O(nm)

#include <iostream>
#include <cstring>
#include <cstdio>using namespace std;
class Board{
public:char **a;int n, m;void init(int _n, int _m){n = _n, m = _m;a = new char*[n];for(int i = 0; i < n; i++)a[i] = new char[m];}Board(){}Board(int _n, int _m){init(_n, _m);}~Board(){for(int i = 0; i < n; i++)delete[] a[i];delete[] a;}void print(){for(int i = 0; i < n; i++){for(int j = 0; j < m; j++)cout<<a[i][j];cout<<endl;}}
};
void inline change(char &a){a = '1' + '0' - a;
}
inline void changex(char **a, int n, int m, int x, int y){if(y == 0){change(a[x][y]);change(a[x-1][y]);change(a[x-1][y+1]);change(a[x-2][y+1]);}else{change(a[x][y]);change(a[x-1][y]);change(a[x-1][y-1]);change(a[x-2][y-1]);}
}
inline void changey(char **a, int n, int m, int x, int y){if(x == 0){change(a[x][y]);change(a[x][y-1]);change(a[x+1][y-1]);change(a[x+1][y-2]);}else{change(a[x][y]);change(a[x][y-1]);change(a[x-1][y-1]);change(a[x-1][y-2]);}
}
bool solve(char **a, int n, int m){if(n == 2 && m == 2){if(a[0][1] != a[0][0] || a[1][0] != a[0][0] || a[1][1] != a[0][0])return false;return true;}else if(n <= 2 && m <= 2){for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)if(a[i][j] == '1')return false;return true;}else if(n == 1){while(m >= 4){if(a[0][m-1] == '1'){change(a[0][m-1]);change(a[0][m-2]);change(a[0][m-3]);change(a[0][m-4]);}m--;}if(a[0][0] == '1' || a[0][1] == '1' || a[0][2] == '1')return false;else return true;}else if(m == 1){while(n >= 4){if(a[n-1][0] == '1'){change(a[n-1][0]);change(a[n-2][0]);change(a[n-3][0]);change(a[n-4][0]);}n--;}if(a[0][0] == '1' || a[1][0] == '1' || a[2][0] == '1')return false;else return true;}while(m >= 3){for(int i = 0; i < n; i++)if(a[i][m-1] == '1')changey(a, n, m, i, m-1);m--;}while(n >= 3){for(int i = 0; i < m; i++)if(a[n-1][i] == '1')changex(a, n, m, n-1, i);n--;}int cnt = 0;for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)cnt += a[i][j]=='1'?1:0;if(cnt % 2 == 0)return true;return false;
}
int main()
{
//    freopen("in", "r", stdin);int t;cin>>t;while(t--){int n, m;scanf("%d%d\n", &n, &m);Board *a = new Board(n, m);int i = 0, j = 0;while(i < n){a->a[i][j] = getchar();j++;if(j == m){getchar();i++;j = 0;}}if(solve(a->a, a->n, a->m))cout<<"Yes"<<endl;else cout<<"No"<<endl;delete a;}return 0;
}

转载于:https://www.cnblogs.com/7391-KID/p/10610710.html

51nod 1851 俄罗斯方块(思维题)相关推荐

  1. 51 nod 1851 俄罗斯方块

    1851 俄罗斯方块 基准时间限制:1 秒 空间限制:131072 KB 分值: 160  难度:6级算法题   玩过俄罗斯方块?那你知道俄罗斯方块共有七种吧(其实只有五种) 给一个黑白图,每次能将某 ...

  2. little w and Soda(思维题)

    链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  3. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

  4. yoyo思维题(困难) 组合数学

    问题 B: yoyo思维题(困难) 时间限制: 1 Sec  内存限制: 256 MB 提交: 11  解决: 3 [提交][状态][讨论版][命题人:qianyouyou][Edit] [TestD ...

  5. 1884: 三个家庭(思维题)

    1884: 三个家庭 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 244 Solved: 81 [Submit][Status][Web Board] ...

  6. 思维题 UVA 10881 Piotr's Ants

    题目传送门 1 /* 2 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 3 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 4 关键2:蚂蚁的相对位置 ...

  7. CF--思维练习-- CodeForces - 215C - Crosses(思维题)

    ACM思维题训练集合 There is a board with a grid consisting of n rows and m columns, the rows are numbered fr ...

  8. ACM思维题训练 Section A

    题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...

  9. CodeForces - 1102A(思维题)

    https://vjudge.net/problem/2135388/origin Describe You are given an integer sequence 1,2,-,n. You ha ...

最新文章

  1. 数据草拟:使您的团队热爱数据的研讨会
  2. android ble 实现自动连接,Android:自动重新连接BLE设备
  3. python中调用是什么意思_在Python中调用函数的含义?
  4. System.load(String filename)和System.loadLibrary(String libname)的区别
  5. linux交叉编译出现的问题,,Ubuntu 14.10下安装GCC交叉编译器遇到问题及解决方法
  6. 配置登入是显示服务器信息
  7. zencart后台修改首页meta_title、meta_keywords、meta_description
  8. JavaScript函数的两种声明方式(4)
  9. 笔记︱金融风险之欺诈分类以及银行防控体系简述
  10. make menuconfig显示错误“Your display is too small to run Menuconfig!”
  11. 学习HTML 笔记A3 :HTML标题、段落、文本格式化
  12. 无刷直流电动机的工作原理
  13. 7-11 最长的单词
  14. html页面设计参考文献英文,网页设计网站参考文献(国外英文资料).doc
  15. k8s安装dashboard及账号密码登陆
  16. Pycharm踩坑(一) FileNotFoundError: [Errno 2] No such file or directory: ‘../data/users.txt‘ 目录结构
  17. 统一依赖管理Composing builds
  18. 当科技成为潮流,下一个新十年的未来应该如何畅想?
  19. 在mysql中删除数据后,添加数据,id值依然从删除的位置开始增加,问题详解。
  20. 5W1H分析法 什么是5W1H分析法?

热门文章

  1. PHP获取IP地址的方法,防止伪造IP地址注入攻击
  2. 7月15号day7总结
  3. 调用百度 Echarts 显示重庆市地图
  4. Spring-Security 自定义Filter完成验证码校验
  5. ftp如何预览图片 解决方案
  6. SQL2005中row_number()等函数的用法
  7. java/j2ee中文问题终极解决之道
  8. Java——线程锁,死锁,等待唤醒机制
  9. C#使用TCP/IP与ModBus进行通讯
  10. JavaScript中的数组创建