题目链接:点击查看

题目大意:给出一个n*m的01矩阵,为了好描述,我们设0和1是两个相反的状态,我们的目标是要将整个矩阵全部变成1,现在我们可以将某一个点(x,y)更改为相反的状态,不过相应的该点周围的四个点(x+1,y),(x-1,y),(x,y+1),(x,y-1)也都需要变为其本身相反的状态,问若想要满足条件最少需要操作多少次,并输出方案

题目分析:今天看大蓝书位运算的时候看到了一个简单版本的题目,直接给秒了,不过瘾,想起来之前在poj上做过一个很类似的稍难点的题目,也就是现在这道了,当时卡了我好久,最后还是面向题解编程才写出来的,现在再回顾一下这给题目直接就给秒了,感觉真的太爽啦

回到这个题目上,若我们固定了第一行之后(不能再改变第一行了),则满足题意的方案至多只有1种,其原因是:当第i行某一位为0时,若前i行已经被固定,只能点击第i+1行该位置上的数字才能使第i行的这一位变为1,从上到下按照行依次传递就能得到方案了,又因为n和m最大只有15,我们可以直接对列状态压缩,首先枚举第一行的所有状态,至多有2^m次方种情况,其中二进制中的1表示翻转该方块,0表示不翻转该方块,当确定好第一行的状态后,不断向下传递状态就好了,判断一下最后一行的状态能不能满足条件,若可以的话尝试更新最小值,并用一个数组记录一下答案,最后输出答案就好了,总的时间复杂度是n*2^m,这个题目为了迎合题意以及简化操作,自己写了不少函数,用起来还是挺方便的

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int n,m;int maze[20][20],temp[20][20],temp2[20][20],ans[20][20];
//maze:维护初始矩阵 temp:每次处理时暂时用到的副本矩阵 temp2:记录每次答案用的 ans:记录最小值的答案void _copy(int s[][20],int t[][20])//将t数组复制给s数组
{for(int i=0;i<n;i++)for(int j=0;j<m;j++)s[i][j]=t[i][j];
}bool check(int a[])//检查某一行的状态是否全部为1
{for(int i=0;i<m;i++)if(a[i])return false;return true;
}void solve(int a[][20],int x,int y)//改变当前方块以及四周方块的状态
{a[x][y]^=1;if(x-1>=0)a[x-1][y]^=1;if(y-1>=0)a[x][y-1]^=1;if(x+1<20)a[x+1][y]^=1;if(y+1<20)a[x][y+1]^=1;
}int main()
{
//  freopen("input.txt","r",stdin);
//    ios::sync_with_stdio(false);while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++)for(int j=0;j<m;j++)scanf("%d",&maze[i][j]);int mmin=inf;//维护最小方案数for(int i=0;i<1<<m;i++)//枚举2^m种情况{int cnt=0;//记录当前方案数_copy(temp,maze);memset(temp2,0,sizeof(temp2));for(int j=0;j<m;j++)//维护第一行{if(i>>j&1){solve(temp,0,j);temp2[0][j]=1;cnt++;}}for(int i=1;i<n;i++)//逐层向下转移状态for(int j=0;j<m;j++){if(temp[i-1][j]){solve(temp,i,j);temp2[i][j]=1;cnt++;}}if(check(temp[n-1]))//检查最后一行{if(mmin>cnt)//尝试更新最小值{mmin=cnt;_copy(ans,temp2);}}}if(mmin==inf)printf("IMPOSSIBLE\n");else{for(int i=0;i<n;i++){printf("%d",ans[i][0]);for(int j=1;j<m;j++)printf(" %d",ans[i][j]);printf("\n");}}}return 0;
}

POJ - 3279 Fliptile(状态压缩+位运算+暴力)相关推荐

  1. hdu3006 状态压缩+位运算+hash(小想法题)

    题意:        给了n个集合,问你这n个集合可以组合出多少种集合,可以自己,也可以两个,也可以三个....也可以n个集合组在一起. 思路:       是个小想法题目,要用到二进制压缩,位运算, ...

  2. 洛谷P1562 还是N皇后(DFS+状态压缩+位运算)

    八皇后问题的介绍在此不再赘述,只贴一下经典八皇后问题的实现代码(参考刘汝佳 <算法竞赛入门经典>) void search(int i) {if(i>n){ans++;return; ...

  3. POJ-2414 Phylogenetic Trees Inherited 状态压缩,位运算处理集合操作

    该题解题过程非常优美,通过位操作来维护一个可选字符集合.并且完成求并集和交集. 详见代码: #include <cstring> #include <cstdio> #incl ...

  4. LeetCode 2157. 字符串分组(状态压缩+位运算+图的遍历)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的字符串数组 words . 每个字符串都只包含 小写英文字母 .words 中任意一个子串中,每个字母都至多只出现一次. 如果通 ...

  5. POJ 3279(Fliptile)题解

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

  6. POJ 3279 Fliptile

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

  7. poj 1873 The Fortified Forest (位运算枚举 + 凸包周长)

    题目链接:http://poj.org/problem?id=1873 大意:有一片N棵树的森林,要从中砍掉几棵树做成篱笆,把剩下的树围起来 输入:给N课树,每棵树的坐标是x,y,每棵树有一个vi和l ...

  8. java 位运算 多个状态_位运算表示对象所处状态

    通过一个integer类型属性来表示对象所处的状态: CASE: Invitor:邀请者对象模型 Integer Invitor.joinstatus:邀请者所处参加状态 当前存在状态声明:是否被邀请 ...

  9. CodeForces - 1457D XOR-gun(位运算+暴力)

    题目链接:点击查看 题目大意:给出一个长度为 n 的非降序列,现在可以执行数次操作:选择相邻的两个位置将其替换成异或和,更具体的,每次操作可以选择一个位置 i ,满足 1 <= i < n ...

最新文章

  1. SAP 没有激活HUM功能照常可以使用Handling Unit
  2. python 多线程 多进程 zmq_研二硕, Python +pyqt,多进程问题求助
  3. [羊城杯 2020]Power
  4. 【算法】一个简单的决策树(DT)原理
  5. PHP面向对象的进阶学习
  6. POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...
  7. 第4章 字符串和格式化输入/输出
  8. Lambdas:来到您附近的Java 8!
  9. 如何过滤 adb logcat 命令的输出
  10. 使用Qt设计师文件的3种方式
  11. 照搬照做无疑了!2019新iPhone系列确定“浴霸摄像头”
  12. java系列视频教程下载
  13. 基于JSP实现学校社团管理系统
  14. 【python爬虫】动漫之家漫画下载(scrapy)
  15. Kudu之Tablet的发现过程
  16. Java文件拒绝访问问题
  17. IT行业十大热门职位
  18. 已有一个已排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中。
  19. matlab 匹配屏幕大小写,匹配正则表达式(不区分大小写)
  20. ibm服务器修改uefi和legacy,uefi和legacy的区别详细分析(附带uefi改legacy教程)

热门文章

  1. wordpress archive.php,哪个网址将导致wordpress使用archive.php?
  2. 上一页下一页_Excel打印时一页放不下,4招轻松搞定,省下的纸叫老板加工资
  3. CORS 跨域-同源
  4. springmv的执行流程是什么
  5. leader选举的源码分析-runFromConfig
  6. SIMPLE/REUSE/BATCH 三种执行器的区别?
  7. 简单分析ComponentScan
  8. 使用RSA算法解析令牌
  9. 百万数据报表读取:步骤分析以及自定义事件处理器
  10. MapReduce-Reduce端join操作-步骤分析