D - Fliptile POJ - 3279

题意: 给一个m*n的01矩阵,对某一块砖踩一脚,1->0 || 0->1, 求将整个举证全部变为0最少踩几次

典型的翻转问题,此类问题的特点

  1. 要么翻1次要么不翻,其余情况重复了
  2. 与先翻了哪一块无关,只考虑最终翻没翻即可

利用以上性质,为了方便搜索,我们枚举出第一行的所有可能情况(注意如何按照字典序枚举),则第一行决定了第二行哪些格子必须被踩,因为如果不踩第一行将存在 1 不满足,之后几行同理。对最后一行也完成所有操作后,判断最后一行是否全为0,是则找出一组答案。

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 17;
int m, n;
bool mp[maxn][maxn], ans[maxn][maxn], turn[maxn][maxn];
int cnt, res;
int dx[] = {1,-1,0,0,0};
int dy[] = {0,0,1,-1,0};bool color(int x, int y) {int tmp = mp[x][y], nx, ny;for(int i = 0; i < 5; i++) {nx = x + dx[i]; ny = y + dy[i];if(nx <= m && nx >= 1 && ny >= 1 && ny <= n)tmp += turn[nx][ny];}return tmp&1; // 奇数次则为黑
}void dfs() {for(int i = 2; i <= m; i++) {for(int j = 1; j <= n; j++) {if(color(i-1, j)) { // 上一行砖为黑色则需要反转当前位置 turn[i][j] = 1;cnt++;}if(res <= cnt) return ; // 最优化剪枝 }}for(int j = 1; j <= n; j++) {if(color(m, j)) return ;}res = cnt;memcpy(ans, turn, sizeof(turn));
}void print() {for(int i = 1; i <= m; i++) {for(int j = 1; j <= n; j++) {printf("%d ", ans[i][j]);}printf("\n");}
}int main() {//  freopen("test.in", "r", stdin);while(~scanf("%d%d", &m , &n)) {res = INF;memset(ans, 0, sizeof(ans));for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)scanf("%d", &mp[i][j]);// 处理第一行所有可能情况 for(int j = 0; j < (1 << n); j++) {cnt = 0;memset(turn, 0, sizeof(turn));for(int i = 1; i <= n; i++) {turn[1][i] = (j >> (n-i)) & 1; // 按字典序查找第一行所有情况,不懂的话可以用下面输出或者手动模拟
//              cout << turn[1][i] << " "; if(turn[1][i]) cnt++;    }dfs();
//          cout << endl;}if(res==INF) printf("IMPOSSIBLE\n");else print();}return 0;
}

D - Fliptile POJ - 3279(翻转问题)相关推荐

  1. Fliptile POJ - 3279 (翻转)(二进制+对第一行暴力遍历翻转的位置)

    题意:给你一个给你一个矩阵,有黑白两个状态.每次你可以选择一个变为其相反的状态,它周围的4个都会变成相反的状态.问你最少需要改变多少个使得矩阵中的状态全为白色,若有多个答案,输出字典序最小的 思路:白 ...

  2. [kuangbin带你飞]专题一 简单搜索D - Fliptile(POJ 3279)

    题目大意 给一个N行M列的矩阵,值分别为0和1,每次你可以选择将一个变成相反状态,同时,它周围的四个数也会变为相反状态. 问:最少翻转多少次,可以将所有值都变成0 多个解,输出翻转次数最少的(若有次数 ...

  3. POJ 3279(Fliptile)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...

  4. poj 3279 poj 1753

    poj 3279: Description Farmer John knows that an intellectually satisfied cow is a happy cow who will ...

  5. POJ 3279 Fliptile

    传送门:http://poj.org/problem?id=3279 Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

  6. POJ - 3279 Fliptile(状态压缩+位运算+暴力)

    题目链接:点击查看 题目大意:给出一个n*m的01矩阵,为了好描述,我们设0和1是两个相反的状态,我们的目标是要将整个矩阵全部变成1,现在我们可以将某一个点(x,y)更改为相反的状态,不过相应的该点周 ...

  7. 凡人修c传(四)翻牌子(POJ - 3279 - Fliptile)(思维+dfs)

    本萌新初来乍到,不知代码的险恶,曾看过一篇帖子,大佬说他一天就打了一题,十分崩溃,底下评论芸芸,另一位大佬说,没事,可能将来你一天看一个题解都未必能看懂. 当我打完这题时,我觉得大佬说的对...... ...

  8. 凡人修c传(四)翻牌子(POJ - 3279 - Fliptile每日一水)

    本萌新初来乍到,不知代码的险恶,曾看过一篇帖子,大佬说他一天就打了一题,十分崩溃,底下评论芸芸,另一位大佬说,没事,可能将来你一天看一个题解都未必能看懂. 当我打完这题时,我觉得大佬说的对...... ...

  9. poj 1753 翻转棋子

    题目大意: http://poj.org/problem?id=1753 翻转棋子,每个棋子只能翻转一次,因为翻转两次的效果是没翻,翻转三次的效果和翻转一次一样... 代码: #include < ...

最新文章

  1. scanf printf sprintf fprintf
  2. PowerDesigner使用教程3
  3. C语言程序设计50例(三)(经典收藏)
  4. ARM中的RO、RW和ZI DATA
  5. 【ArcGIS风暴】什么是点云?什么是Las数据集?一篇文章告诉你点云数据的奥秘
  6. kali里PHP文件502错误,解决Linux Kali iptables开放22端口失败等一系列问题
  7. opencv中,c和c++版本区别体验
  8. python字典购物车实现的功能_python购物车功能实现
  9. php setheader,PHP-MPDF:如何删除setHeader()和setFooter()边框
  10. OpenGL基础1:最简单的OpenGL例子
  11. Hibernate性能优化2( 转)
  12. 手机怎么识别图中文字?这两个方法靠谱
  13. 【python数模小作业】动手‘预习‘高数之 人口预测(线性拟合)
  14. 人工智能对我们的影响(随便谈谈)
  15. 企业什么喜欢做电视看板,电视看板浏览网页的必备工具 电视看板浏览器 电视看板自动打开网页
  16. AndroidStudio蓝牙通信
  17. 0-1背包问题及python实现
  18. 人人商城v3.28.41修复11月8日微信登录接口,公众号和小程序同步修复
  19. 鸿蒙系统浏览器内核,四大浏览器横评出炉:Chromium 内核版 Edge 四项夺冠,优于原生 Chrome...
  20. 切比雪夫逼近法设计FIR滤波器

热门文章

  1. 栈与队列9——最大值减去最小值小于或等于num的子数组的数量
  2. 安装包制作工具 SetupFactory使用1 详解
  3. 潮州市云计算数据中心挂牌 粤东地区规模最大
  4. 浏览器--如何让登陆页面的表单不默认显示账号和密码
  5. 学习SQLite之路(五) C/C++ SQLite开发实例
  6. windows时间同步命令
  7. jfreechart的使用
  8. 日常积累的一些linux和运维的东西 [转]
  9. 11旋转编码器原理_科普小知识:八分钟了解电机编码器!
  10. android 表示空字符串,Android Logcat获取空字符串时非常奇怪的行为