题意:有一个n*m的格子,每个格子都有黑白两面(0表示白色,1表示黑色)。我们需要把所有的格子都反转成黑色,每反转一个格子,它上下左右的格子都会跟着反转。请求出用最小步数完成反转时每个格子反转的次数。有多个解时,输出字典序最小的一组。

思路就是先判断第一行,然后如果第一行确定了,那么第二行就必须确定了(如果第一行某个是黑色的,那么必定要在第二行给它翻过来),所以一直到底m-1行都是确定的,接下来只要判断第m行是否是全白就好了。直接枚举第一行就可以,代码是我参考大神的代码写的,里面的二进制枚举操作还是看了有一会儿才看懂

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

const int N = 20;
int gh[N][N];//初试的数组
int ch[N][N];//操作的数组
int vis[N][N];//记录翻过的牌子
int re[N][N];//
int ans[N][N];//记录答案

int fNum,aNum,n,m;

void solve( int i,int j ){
    fNum++;//操作次数+1
    vis[i][j] = 1;
    ch[i][j] = 1 - ch[i][j];
    ch[i-1][j] = 1 - ch[i-1][j];
    ch[i][j-1] = 1 - ch[i][j-1];
    ch[i+1][j] = 1 - ch[i+1][j];
    ch[i][j+1] = 1 - ch[i][j+1];
}

void record(){
    aNum = fNum;//最小次数记录一下
    for( int i = 1; i <= m; i++ ){
        for( int j = 1; j <= n; j++ ){
            ans[i][j] = vis[i][j];
        }
    }
}

int main(){
    cin >> m >> n;
    for( int i = 1; i <= m; i++ ){
        for( int j = 1; j <= n; j++ ){
            cin >> gh[i][j];
        }
    }
    aNum = 10010;
    int t = 1 << n;
    for( int loop = 0; loop < t; loop++ ){
        for( int i = 1; i <= m; i++ ){
            for( int j = 1; j <= n; j++ ){
                ch[i][j] = gh[i][j];
            }
        }
        memset(vis,0,sizeof(vis));
        fNum = 0;//记录需要操作的数目
        int moveN = loop;//这里是二进制,二进制
        for( int i = 1; i <= n; i++ ){
            if( moveN&1 ){//这里我看了很久才看明白
                //假入一个数字的二进制是0101,意思就是
                //第一格翻,第三格翻,上面t为2的N次方,包括了所有的
                //可能性的二进制对应的数字
                solve( 1,i );
            }
            moveN >>= 1;
        }
        for( int i = 2; i <= m; i++ ){
            for( int j = 1; j <= n; j++ ){
                if( ch[i-1][j] ){//如果上一行是黑色,就处理这一行
                    solve(i,j);
                }
            }
        }
        bool flag = true;
        for( int j = 1; j <= m; j++ ){
            if( ch[m][j] ){//直接判断最后一行是否满足
                flag = false;
                break;
            }
        }
        if( flag and fNum < aNum ){
            record();
        }
    }
    if( aNum == 10010 ){
        cout << "IMPOSSIBLE\n";
        return 0;
    }else{
        for( int i = 1; i <= m; i++ ){
            cout << ans[i][1];
            for( int j = 2; j <= n; j++ ){
                cout << " " << ans[i][j];
            }
            cout << endl;
        }
    }
}

poj 3279(暴力)的更多相关文章

  1. 【枚举】POJ 3279

    直达–>POJ 3279 Fliptile 题意:poj的奶牛又开始作孽了,这回他一跺脚就会让上下左右的砖块翻转(1->0 || 0->1),问你最少踩哪些砖块才能让初始的砖块全部变 ...

  2. POJ 3279(Fliptile)题解

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

  3. POJ 2182/暴力/BIT/线段树

    POJ 2182 暴力 /* 题意: 一个带有权值[1,n]的序列,给出每个数的前面比该数小的数的个数,当然比一个数前面比第一个数小的个数是0,省略不写,求真正的序列.(拗口) 首先想到的是从前到后暴 ...

  4. POJ 3279 Fliptile(翻格子)

    POJ 3279 Fliptile(翻格子) Time Limit: 2000MS    Memory Limit: 65536K Description - 题目描述 Farmer John kno ...

  5. POJ.3279 Fliptile (搜索+二进制枚举+开关问题)

    POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...

  6. 状态压缩+枚举 POJ 3279 Fliptile

    题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...

  7. POJ 3279 - Fliptile - [状压+暴力枚举]

    题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...

  8. POJ - 3279(枚举+暴力)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14297   Accepted: 5257 Descrip ...

  9. POJ 3279 Filptile dfs

    题目链接:http://poj.org/problem?id=3279 大意:给出一块n*m的棋盘.里面放满了棋子.有1和0两种状态.给出初始状态,翻动的时候会把当前位置和当前位置的上下左右共五个位置 ...

随机推荐

  1. (转)查看SQLServer最耗资源时间的SQL语句

    原文地址:https://www.cnblogs.com/My-Dream/p/6270308.html 1.找出执行时间最长的10条SQL(适用于SQL SERVER 2005及其以上版本) SEL ...

  2. android 开发 View _1_ View的子类们 和 视图坐标系图

    目录: android 开发 View _2_ View的属性动画ObjectAnimator ,动画效果一览 android 开发 View _3_ View的属性动画ValueAnimator a ...

  3. 彻底解决COM端口被占用(在使用中)问题的办法

    今天就遇到这个问题了串口调试的时候发现usb转串口使用的是COM8而串口调试助手里面只有COM1到4,我想去该COM口发现COM1到7都在使用中,找了好多办法都不行,后面在网上找到这篇解决办法的文章, ...

  4. Generalizations

    Generalizations Congratulations! You've learned five commands commonly used to navigate the filesyst ...

  5. CentOS6.5搭建OpenVas完全搭建手册(搭建过程总结及小记)

    一.OpenVAS 介绍 1.关于OpenVAS OpenVAS(Open Vulnerability Assessment System)是一套开源的漏洞扫描系统,早期Nessus 是其中一个最流行 ...

  6. java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider

    今天部署完一个测试war包,打开页面的时候报错: HTTP Status 500 - Handler processing failed; nested exception is java.lang. ...

  7. Mybatis控制台打印sql

    mybatis-config.xml配置如下: <configuration> <settings> <setting name="lazyLoadingEna ...

  8. # 20175213 2018-2019-2 《Java程序设计》第1周学习总结

    在本周的java学习中,我收获了很多也遇到了很多的困难1.在寒假的预学习中,因为没能完全的安好虚拟机,导致在本周的学习一开始,虚拟机就崩溃了,所以又重新开始重头安装虚拟机.但因为网速等各种问题,虚拟机 ...

  9. Codeforces Round #438 A. Bark to Unlock

    题意:给你一个原串和n个子串,问你这n个子串任意组合起来能不能使原串出现,串的长度为2. Examples Input ya4ahoytoha Output YES Input hp2http Out ...

  10. Django_Form验证(三)字段,字段的参数,widgets种类

    Form工具是一个很强大的工具,所以他的功能不仅仅是上面2个例子,这里详细记录一下Form的其他功能 字段的一般参数,以CharFields为列子: user=fields.CharField( re ...