POJ 3279 Fliptile(DFS+反转)
题目链接:http://poj.org/problem?id=3279
题目大意:有一个n*m的格子,每个格子都有黑白两面(0表示白色,1表示黑色)。我们需要把所有的格子都反转成黑色,每反转一个格子,它上下左右的格子都会跟着反转。请求出用最小步数完成反转时每个格子反转的次数。有多个解时,输出字典序最小的一组。
解题思路:只要枚举第一行的2^m种情况,如果一个位置上一行是1,那这个位置一定要反转,因为只有这一行能改变上一行,所以每一行的状态都是由前一行决定的。只要最后判断最后一行是不是都是0即可,关于最小字典序,只要从右往左枚举,第一个方案就是正解。(时间复杂度O(n*m*2^m)。
代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int N=; int n,m;
bool flag;
int map[N][N],sta[N][N],tmp[N][N];//sta表示踩或不踩
int d[][]={{,},{,},{,},{,-},{-,}}; //反转坐标为(i,j)的格子
void reverse(int i,int j,int s[][N]){
for(int k=;k<;k++){
int x=i+d[k][];
int y=j+d[k][];
s[x][y]=!s[x][y];
}
} void dfs(int y){
if(flag)
return;
if(y>=){
//不踩
sta[][y]=;
dfs(y-);
//踩
sta[][y]=;
reverse(,y,map);
dfs(y-);
reverse(,y,map);
}
else{
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
tmp[i][j]=map[i][j];
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
sta[i][j]=;
if(tmp[i-][j]==){
reverse(i,j,tmp);
sta[i][j]=;
}
}
} bool sign=true;
for(int i=;i<=m;i++){
if(tmp[n][i]==){
sign=false;
break;
}
}
if(sign){
flag=true;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(j==m)
printf("%d\n",sta[i][j]);
else
printf("%d ",sta[i][j]);
}
}
}
}
} int main(){
while(~scanf("%d%d",&n,&m)){
memset(sta,,sizeof(sta));
flag=false;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&map[i][j]);
}
}
dfs(m);
if(!flag)
puts("IMPOSSIBLE");
}
return ;
}
POJ 3279 Fliptile(DFS+反转)的更多相关文章
- POJ 3279 Fliptile(反转 +二进制枚举)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13631 Accepted: 5027 Descrip ...
- POJ - 3279 Fliptile(反转---开关问题)
题意:有一个M*N的网格,有黑有白,反转使全部变为白色,求最小反转步数情况下的每个格子的反转次数,若最小步数有多个,则输出字典序最小的情况.解不存在,输出IMPOSSIBLE. 分析: 1.枚举第一行 ...
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- 状态压缩+枚举 POJ 3279 Fliptile
题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- POJ 3279 Fliptile (dfs+二进制)
Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more ...
- poj 3279 Fliptile (简单搜索)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16558 Accepted: 6056 Descrip ...
- POJ 3279 Fliptile[二进制状压DP]
题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...
随机推荐
- BZOJ3527:[ZJOI2014]力——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3527 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 参考:https://ww ...
- x64 win64编译环境下ADO链接Access数据库的问题解决
原文链接地址:https://blog.csdn.net/HW140701/article/details/71077579 Win32编译环境下,用ADO数据库连接Access数据库一般都不会报错, ...
- JavaScript的变量预解析特性
JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢?事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了解到,J ...
- winform设计一个登录界面和修改密码的界面-自动切换窗体(问题[已解] 望一起讨论)(技术改变世界-cnblog)
http://www.cnblogs.com/IAmBetter/archive/2012/01/14/2322156.html winform设计一个登录界面和修改密码的界面-自动切换窗体(问题[已 ...
- 折腾到死:matlab7.0 安装
matlab7.0应该是2004年的东西了吧,装起来相当费劲!为什么不用更高的版本呢?其实我也想,之前安装的2013a安装包就5个多G,安装完之后就十多个G了.我习惯将软件安装到C盘,可怜我那100G ...
- 斯皮尔曼等级相关(Spearman’s correlation coefficient for ranked data)
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Kruskal-Wallis test
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- (转) 使用vivado创建工程 4[完结]
由于自己手头暂时没有开发板,因此本节没有测试,故告之. Connecting to ZedBoardBefore we can run the application we have to conne ...
- Hibernate学习(3)- *.hbm.xml详解
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBL ...
- Windows 安装 RabbitMQ
RabbitMQ概述 RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.Ra ...