zoukankan      html  css  js  c++  java
  • 1050 棋盘染色 2

    1050 棋盘染色 2

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 大师 Master
     
     
     
    题目描述 Description

    有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块。

    输入描述 Input Description

    第一行一个整数N(<=100),接下来N行每行一个长度为5的01串,1表示所在格子已经被染成了黑色,0表示所在格子没有被染色。

    输出描述 Output Description

    第一行一个整数N(<=100),接下来N行每行一个长度为5的01串,1表示所在格子已经被染成了黑色,0表示所在格子没有被染色。

    样例输入 Sample Input

    5
    11100
    11000
    10000
    01111
    11111

    样例输出 Sample Output

    1

    数据范围及提示 Data Size & Hint

    N(<=100)

     

    70分代码,TLE了4个点

    原理:用棋盘染色1(搜索)

    70代码:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define N 110
    const int dx[]={0,0,1,-1};
    const int dy[]={1,-1,0,0};
    int n,sx,sy,tot,total;
    bool a[N][6],vis[N][6];
    void check_dfs(int x,int y){
        tot++;
        vis[x][y]=1;
        for(int i=0;i<4;i++){
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(!vis[nx][ny]&&nx>=1&&nx<=n&&ny>=1&&ny<=5&&a[nx][ny])
                check_dfs(nx,ny);
        }
    }
    bool can(int x){
        tot=0;
        memset(vis,0,sizeof vis);
        check_dfs(sx,sy);
        if(tot==total+x) return 1;
        return 0;
    }
    bool power_dfs(int x,int y,int now,int sum){
        if(now==sum){
            if(can(sum)) return 1;
            return 0;
        }
        for(int j=y+1;j<=5;j++){
            if(!a[x][j]){
                a[x][j]=1;
                if(power_dfs(x,j,now+1,sum)) return 1;
                a[x][j]=0;
            }
        }
        for(int i=x+1;i<=n;i++){
            for(int j=1;j<=5;j++){
                if(!a[i][j]){
                    a[i][j]=1;
                    if(power_dfs(i,j,now+1,sum)) return 1;
                    a[i][j]=0;
                }
            }
        }
        return 0;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=5;j++){
                scanf("%1d",&a[i][j]);
                if(a[i][j]){
                    total++;
                    sx=i;sy=j;
                }
            } 
        }
        for(int i=0;i<=5*n;i++){
            if(power_dfs(1,1,0,i)){
                printf("%d
    ",i);
                return 0;
            }
        }
        return 0;
    }

    AC代码:(状压dp超noip范围,代码又那么长,看一眼就困了)

    自行百度

  • 相关阅读:
    Hibernate配置
    Log4j 局部笔记
    有关接口 笔记 懒人版
    JAVA面向对象编程这本书的摘录~!(2016-5-23)
    关于关闭数据流
    安卓桌面开发小应用
    ACM Sdut 2158 Hello World!(数学题,排序) (山东省ACM第一届省赛C题)
    hdu 1573 A/B (扩展欧几里得)
    hdu 1788 Chinese remainder theorem again(最小公倍数)
    ACM hdu 1019 Least Common Multiple
  • 原文地址:https://www.cnblogs.com/shenben/p/5780937.html
Copyright © 2011-2022 走看看