题目链接:Fliptile

题目描述:一个nm得网格,每个网格可以是黑色也可以是白色(黑色为1,白色为0),现在可以翻转任何一块网格,使得其本身以及上下左右五块网格变色(黑变成白,白变成黑),问最少几次能让所有网格都是白色。
题解:首先要知道得是,每一块网格,只有两种状态,要不翻转他,要不不翻转他,那么一共有2的n
m种情况,所以普通的搜索肯定行不通。然而,我们发现,能翻转某一块的网格的颜色的只有跟他有接触的(上下左右)以及他自己,那么我们就可以先让他上一行全部变成白色(这样就没有其他网格能让他重新变黑了),那么我们只需要枚举第一行所有的情况(每一个网格翻转或者不翻转,复杂度为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相关推荐

  1. kuangbin 专题一 简单搜索

    kuangbin 专题一 简单搜索 1.POJ1321棋盘问题[DFS] 代码 自己的想法 2.POJ2251Dungeon Master[三维空间BFS] 代码 自己的想法 3.POJ3278 Ca ...

  2. 老鱼的-kuangbin专题题解

    kuangbin专题问题一览 专题一 简单搜索 POJ 1321 棋盘问题 POJ 2251 Dungeon Master POJ 3278 Catch That Cow POJ 3279 Flipt ...

  3. kuangbin专题十二 基础DP

    kuangbin专题十二 基础DP A - HDU1024 Max Sum Plus Plus B - HDU1029 Ignatius and the Princess IV C - HDU1069 ...

  4. [kuangbin]专题九 连通图 题解+总结

    kuangbin专题链接:https://vjudge.net/article/752 kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian ...

  5. Kuangbin专题三Dancing Links

    Kuangbin专题三Dancing Links 没写完所有的,因为要去上课了赶紧先预习一下,这就先发出来吧. 跳舞链这东西以前在hihocoder上翻到过,当时看的模模糊糊的,现在好好学一学. 暂时 ...

  6. 【kuangbin专题】计算几何_半平面交

    1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...

  7. kuangbin专题16B(kmp模板)

    题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...

  8. kuangbin专题十六 KMP扩展KMP HDU3068 最长回文

    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input输入有多组case,不超过120组,每组输入为 ...

  9. [kuangbin]专题12 基础DP

    HDU 1024 Max Sum Plus Plus HDU 1029 Ignatius and the Princess IV HDU 1069 Monkey and Banana HDU 1074 ...

  10. 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 ...

最新文章

  1. Android之记录并研究Volley框架中知识点
  2. opencl获取gpu信息_如果在尝试获取OpenCL gpu设备类型时,Char *语句出现问题
  3. Dom4j使用Xpath语法读取xml节点
  4. linux2.6版及以后内核:支持实时、抢占
  5. .NET CoreCLR开发人员指南(上)
  6. mysql字符串语法_MySQL语法模板 函数:字符串
  7. 并查集——程序自动分析(洛谷 P1955)
  8. 发动机冒黑烟_挖掘机冒黑烟,是怎么回事?
  9. Access中使用SQL语句应掌握的几点技巧
  10. Windows下使用CMD下载网络文件
  11. c++实现课程管理系统
  12. 共享软件业余者VS共享软件专业者
  13. 华为路由器BGP简单配置
  14. Latex排版技巧:上下方可输入文字的箭头
  15. 从网络中获取债券收益率数据
  16. BootStrap快速入门
  17. IE浏览器卸载命令行
  18. python商品销售情况数据分析_用python分析小红书销售情况
  19. 单片机流星灯_51单片机流星灯c语言源程序
  20. 华清远见嵌入式c语言学习笔记

热门文章

  1. 实分析royden第四版答案_实分析(原书第4版)_[美]H.L.罗伊登(H.L.Royden) P.M.菲茨帕特里克(P.M.Fitzpatrick)_9787111630845_...
  2. Java小程序之山寨版超级玛丽
  3. chromium 安装flash player
  4. fas怎么翻译成lisp_fas文件格式研究
  5. Android 动态权限申请
  6. 伺服电机常用参数设置_伺服驱动器常见参数的设置
  7. 知悉未来的趋势 ---- 小评 创新者的窘境
  8. Matlab2016b中文乱码怎么办
  9. linux 16.04系统下载,【ubuntu16.04】ubuntu(乌班图系统)镜像文件下载 v16.04 稳定版本-七喜软件园...
  10. 小米8SE 开箱及体验