题目链接:https://vjudge.net/contest/294982#problem/C

题意:给定由0,1组成的m*n型矩阵,每次翻转一个结点会顺带翻转与其相邻的结点,问将矩阵翻转为全0的最小步骤,若有多解,输出字典序最小的(将矩阵看成字符串)。

思路:刚开始用搜索一个结点一个结点地搜,老段错误。后来在网上查了后发现这题好象不是搜索题,首先要知道每个结点最多翻一次,因为翻2次和0次一样,3次和1次一样。因为第一行总共有1<<n种翻法,而只要第一行的翻法确定了之后,后面的翻法也就确定了,后面的翻法为若上一个结点为1,则翻转,这样可将前m-1行全部翻成0,最后只用判断最后一行是否全为0,如果是则这种翻法可行。如果我们在第一行的翻法从0到1<<n-1依次枚举,即按字典序枚举,然后只需要找翻转次数最少的,即可得到结果。

AC代码:

 #include<cstdio>
#include<cstring>
using namespace std; const int inf=0x3f3f3f3f;
int m,n,Min,cnt,a[][],ans[][],b[][],c[][];
int go[][]={,,-,,,,,,,-}; void flip(int x,int y){
for(int i=;i<;++i){
int xx=x+go[i][],yy=y+go[i][];
if(xx>=&&xx<m&&yy>=&&yy<n)
b[xx][yy]=-b[xx][yy];
}
} bool check(){
bool ret=true;
for(int i=;i<n;++i)
if(b[m-][i]){
ret=false;
break;
}
return ret;
} void dfs(int num){
if(num==m) return;
for(int i=;i<n;++i)
if(b[num-][i]){
++cnt;
flip(num,i);
c[num][i]=;
}
dfs(num+);
} int main(){
scanf("%d%d",&m,&n);
for(int i=;i<m;++i)
for(int j=;j<n;++j)
scanf("%d",&a[i][j]);
Min=inf;
for(int i=;i<(<<n);++i){
memcpy(b,a,sizeof(a));
memset(c,,sizeof(c));
cnt=;
for(int j=;j<=n-;++j)
if(i&(<<j)){
++cnt;
flip(,n-j-);
c[][n-j-]=;
}
dfs();
if(check()){
if(Min>cnt){
Min=cnt;
memcpy(ans,c,sizeof(c));
}
}
}
if(Min==inf)
printf("IMPOSSIBLE\n");
else
for(int i=;i<m;++i){
for(int j=;j<n;++j){
printf("%d",ans[i][j]);
if(j!=n-) printf(" ");
}
printf("\n");
}
return ;
}

poj3279(枚举)的更多相关文章

  1. poj3279(dfs+二进制枚举思路)

    题意转载自https://www.cnblogs.com/blumia/p/poj3279.html 题目属性:DFS 相关题目:poj3276 题目原文:[desc]Farmer John know ...

  2. POJ3279 Fliptile 枚举+简单搜索

    题意:一个矩阵,每个点1或0,然后每次翻一个点,它周围上下左右(包括自己)1->0,0->1,问最少翻几次可以矩阵全是0,忽略题目说的字典序 分析:枚举第一行所有的情况,然后下面几行也随之 ...

  3. poj-3279 poj-1753(二进制枚举)

    题目链接:http://poj.org/problem?id=3279 题目大意: 有一个m*n的棋盘(1 ≤ M ≤ 15; 1 ≤ N ≤ 15),每个格子有两面分别是0或1,每次可以对一个格子做 ...

  4. (POJ-3279)Fliptile (dfs经典---也可以枚举)

    Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...

  5. 二进制枚举例题|poj1222,poj3279,poj1753

    poj1222,poj3279,poj1753 听说还有 POJ1681-画家问题 POJ1166-拨钟问题 POJ1054-讨厌的青蛙

  6. [POJ3279]Fliptile(开关问题,枚举)

    题目链接:http://poj.org/problem?id=3279 题解:http://www.cnblogs.com/helenawang/p/5538547.html /* ━━━━━┒ギリギ ...

  7. kb-01-d<poj3279>--深搜变种,二进制优化;

    poj--3279 题意: 给n*m的矩阵,0 1组成,每次翻转一个格子可以将上下左右的五个节点翻转,求,把所有的格子翻转成0:输出每个个字的翻转次数:最少字数: 做法: 从上到下,第一行翻转的情况确 ...

  8. Swift enum(枚举)使用范例

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  9. 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

    建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...

随机推荐

  1. SecureCRT方向键不可用

    SecureCRT方向键不可用,没有反应 选项--会话选项--终端--仿真

  2. JS中点击事件冒泡阻止

    JS中点击事件冒泡阻止 解析: 一个div层'out',内含有一个div层'in'.如下: 两个层都绑定了点击事件,但是点击in层的时候,点击事件会出现冒泡现象,同时也会触发out层的点击事件. 但是 ...

  3. window.location.search的用法 和 地址栏的的javsscript编码与解码

    ocation.search是从当前URL的?号开始的字符串 如:http://www.51js.com/viewthread.php?tid=22720 它的search就是?tid=22720 e ...

  4. [记录] Ubuntu 配置Apache虚拟站点

    版本 Ubuntu 16.04 1 . 首先找到Apapche配置文件夹  /etc/apache2/ apache2.conf conf-enabled magic mods-enabled sit ...

  5. Spring boot 配置嵌入式Servlet容器

    SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 1.修改和server有关的配置(ServerProperties[也是EmbeddedServletContainerCust ...

  6. 排序NB三人组

    排序NB三人组 快速排序,堆排序,归并排序 1.快速排序 方法其实很简单:分别从初始序列“6  1  2 7  9  3  4  5 10  8”两端开始“探测”.先从右往左找一个小于6的数,再从左往 ...

  7. vue:页面跳转和传参(页面之间,父传子,子传父)

    1.返回上一个页面: A.<a @click="$router.back(-1)" class="btn">重新加载</a> B.thi ...

  8. JDBC使用步骤分哪几步?

    (1) 加载JDBC驱动程序: Cllass.forName(" 驱动程序" );   //你要连接的数据库对象 (2) 建立连接 Connection conn=DriverMa ...

  9. 一个神奇的BUG :Failed to finalize session : INSTALL_FAILED_INVALID_APK: /data/app/vmdl99393454.tmp/10_slice__ signatures are inconsistent

    Android Studio 在Gradle编译完成后安装APK时总是失败,EventLog提示如下信息: Failed to finalize session : INSTALL_FAILED_IN ...

  10. Android 深入浅出 - 进程生命周期(Process Lifecycle)

    Android 5 个进程等级 1. Foreground Process : 2 .Visible Process : 3. Service Process : 4. Background Proc ...