kuangbin专题一——Fliptile
题目链接:Fliptile
题目描述:一个nm得网格,每个网格可以是黑色也可以是白色(黑色为1,白色为0),现在可以翻转任何一块网格,使得其本身以及上下左右五块网格变色(黑变成白,白变成黑),问最少几次能让所有网格都是白色。
题解:首先要知道得是,每一块网格,只有两种状态,要不翻转他,要不不翻转他,那么一共有2的nm种情况,所以普通的搜索肯定行不通。然而,我们发现,能翻转某一块的网格的颜色的只有跟他有接触的(上下左右)以及他自己,那么我们就可以先让他上一行全部变成白色(这样就没有其他网格能让他重新变黑了),那么我们只需要枚举第一行所有的情况(每一个网格翻转或者不翻转,复杂度为2的n次方),然后在用下一行去让上一行是黑色的变成白色(翻转t[i+1][j]),以此类推,最后如果第n行在让第n-1行全部翻转成白色,而自己也正好全部是白色,那么此方案就是可行的。
#include <iostream>
#include <cstring>
#include <string.h>
#include <cstdio>
using namespace std;
int t[20][20];
int oldT[20][20];
int book[20][20];
int endBook[20][20];
int n,m;
int minn = 0x7f7f7f7f;
int ans = -1;
void dfs(int k,int change)
{if(k > n){return;}int newChange = change;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){t[i][j] = oldT[i][j];}}for(int i = 2;i <= n; i++){for(int j = 1; j <= m; j++){book[i][j] = 0;}}t[1][k] = (1^t[1][k]);t[1][k-1] = (1^t[1][k-1]);t[1][k+1] = (1^t[1][k+1]);t[2][k] = (1^t[2][k]);book[1][k]++;oldT[1][k] = (1^oldT[1][k]);oldT[1][k-1] = (1^oldT[1][k-1]);oldT[1][k+1] = (1^oldT[1][k+1]);oldT[2][k] = (1^oldT[2][k]);newChange++;for(int i = 2; i <= n; i++){for(int j =1; j <= m; j++){if(t[i-1][j] == 1){t[i-1][j] = (1^t[i-1][j]);t[i+1][j] = (1^t[i+1][j]);t[i][j] = (1^t[i][j]);t[i][j-1] = (1^t[i][j-1]);t[i][j+1] = (1^t[i][j+1]);book[i][j]++;newChange++;}}}int g = 0;for(int i = 1; i <= m; i++){if(t[n][i] == 1){g = 1;break;}}if(g == 0){ans = 1;if(newChange < minn){for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){endBook[i][j] = book[i][j];}}minn = newChange;}}dfs(k+1,change+1);newChange = change;for(int i = 2;i <= n; i++){for(int j = 1; j <= m; j++){book[i][j] = 0;}}book[1][k]--;oldT[1][k] = (1^oldT[1][k]);oldT[1][k-1] = (1^oldT[1][k-1]);oldT[1][k+1] = (1^oldT[1][k+1]);oldT[2][k] = (1^oldT[2][k]);for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){t[i][j] = oldT[i][j];}}for(int i = 2; i <= n; i++){for(int j =1; j <= m; j++){if(t[i-1][j] == 1){t[i-1][j] = (1^t[i-1][j]);t[i+1][j] = (1^t[i+1][j]);t[i][j] = (1^t[i][j]);t[i][j-1] = (1^t[i][j-1]);t[i][j+1] = (1^t[i][j+1]);book[i][j]++;newChange++;}}}g = 0;for(int i = 1; i <= m; i++){if(t[n][i] == 1){g = 1;break;}}if(g == 0){ans = 1;if(newChange < minn){for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){endBook[i][j] = book[i][j];}}minn = newChange;}}dfs(k+1,change);
}
int main()
{cin>>n>>m;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin>>oldT[i][j];}}dfs(1,0);if(ans==-1){printf("IMPOSSIBLE\n");}else{for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){if(j==m)printf("%d\n",endBook[i][j]);elseprintf("%d ",endBook[i][j]);}}}return 0;
}
写题遇到的bug:一开始我回溯时用的memset(book),将第一行也给重新标记为0了,导致出错了,dfs的注意两点,一是回溯,二是结束条件,一般思路没出错的情况下,但出现bug很大原因是这两个地方出现了问题
kuangbin专题一——Fliptile相关推荐
- kuangbin 专题一 简单搜索
kuangbin 专题一 简单搜索 1.POJ1321棋盘问题[DFS] 代码 自己的想法 2.POJ2251Dungeon Master[三维空间BFS] 代码 自己的想法 3.POJ3278 Ca ...
- 老鱼的-kuangbin专题题解
kuangbin专题问题一览 专题一 简单搜索 POJ 1321 棋盘问题 POJ 2251 Dungeon Master POJ 3278 Catch That Cow POJ 3279 Flipt ...
- kuangbin专题十二 基础DP
kuangbin专题十二 基础DP A - HDU1024 Max Sum Plus Plus B - HDU1029 Ignatius and the Princess IV C - HDU1069 ...
- [kuangbin]专题九 连通图 题解+总结
kuangbin专题链接:https://vjudge.net/article/752 kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian ...
- Kuangbin专题三Dancing Links
Kuangbin专题三Dancing Links 没写完所有的,因为要去上课了赶紧先预习一下,这就先发出来吧. 跳舞链这东西以前在hihocoder上翻到过,当时看的模模糊糊的,现在好好学一学. 暂时 ...
- 【kuangbin专题】计算几何_半平面交
1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...
- kuangbin专题16B(kmp模板)
题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...
- kuangbin专题十六 KMP扩展KMP HDU3068 最长回文
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input输入有多组case,不超过120组,每组输入为 ...
- [kuangbin]专题12 基础DP
HDU 1024 Max Sum Plus Plus HDU 1029 Ignatius and the Princess IV HDU 1069 Monkey and Banana HDU 1074 ...
- kuangbin专题十六 KMP扩展KMP HDU2594 Simpsons’ Hidden Talents
Homer: Marge, I just figured out a way to discover some of the talents we weren't aware we had. Marg ...
最新文章
- Android之记录并研究Volley框架中知识点
- opencl获取gpu信息_如果在尝试获取OpenCL gpu设备类型时,Char *语句出现问题
- Dom4j使用Xpath语法读取xml节点
- linux2.6版及以后内核:支持实时、抢占
- .NET CoreCLR开发人员指南(上)
- mysql字符串语法_MySQL语法模板 函数:字符串
- 并查集——程序自动分析(洛谷 P1955)
- 发动机冒黑烟_挖掘机冒黑烟,是怎么回事?
- Access中使用SQL语句应掌握的几点技巧
- Windows下使用CMD下载网络文件
- c++实现课程管理系统
- 共享软件业余者VS共享软件专业者
- 华为路由器BGP简单配置
- Latex排版技巧:上下方可输入文字的箭头
- 从网络中获取债券收益率数据
- BootStrap快速入门
- IE浏览器卸载命令行
- python商品销售情况数据分析_用python分析小红书销售情况
- 单片机流星灯_51单片机流星灯c语言源程序
- 华清远见嵌入式c语言学习笔记
热门文章
- 实分析royden第四版答案_实分析(原书第4版)_[美]H.L.罗伊登(H.L.Royden) P.M.菲茨帕特里克(P.M.Fitzpatrick)_9787111630845_...
- Java小程序之山寨版超级玛丽
- chromium 安装flash player
- fas怎么翻译成lisp_fas文件格式研究
- Android 动态权限申请
- 伺服电机常用参数设置_伺服驱动器常见参数的设置
- 知悉未来的趋势 ---- 小评 创新者的窘境
- Matlab2016b中文乱码怎么办
- linux 16.04系统下载,【ubuntu16.04】ubuntu(乌班图系统)镜像文件下载 v16.04 稳定版本-七喜软件园...
- 小米8SE 开箱及体验