题目链接: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. ELK测试安装

    https://blog.csdn.net/guyan0319/article/details/78749639 https://www.cnblogs.com/frankdeng/p/9139035 ...

  2. PHP微信公共号H5支付。

    1.接受支付信息. /** * 发起支付请求 * @return [type] [description] */ function pay($openid){ $nonce_str = $this-& ...

  3. git push error HTTP code = 413

    error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large 将 ...

  4. go遍历某个文件夹

    //遍历文件夹 dir, err := ioutil.ReadDir("./upload_tmp")for _,file := range dir{ logs.Debug(file ...

  5. MySQL主从同步机制及同步中的问题处理

    http://www.drupal001.com/2012/03/mysql-master-slave-troubles/ http://www.jb51.net/article/33052.htm

  6. Servlet之ServletContext获取web上下文路径、全局参数、和Attribute(域)

    1)获取web上下文路径 public void doGet(HttpServletRequest request, HttpServletResponse response) throws Serv ...

  7. C++随记

    1.const限定符 const限定变量的值不可变,并且const对象必须要初始化 const int buf = 512; //正确,表明buf的值为512 buf = 400;  //错误,buf ...

  8. 12.JDBC-mysql.md

    目录 API简述 Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序 Connection接 ...

  9. C++ 设置透明背景图片

    背景:            有两个图片,一个是目标背景图片, 一个是带有自身背景色彩的彩色图片            先将这彩色图片绘制到目标背景图片中, 这一步通过BITBLT就可实现.   但实 ...

  10. C++ AfxBeginThread的介绍/基本用法

    AfxBeginThread    用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一 ...