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

    传送门

    题目描述 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)

    题解:搜索。pxg的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 xx(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])
                xx(nx,ny);
        }
    }
    bool can(int x)
    {
        tot=0;
        memset(vis,0,sizeof vis);
        xx(sx,sy);
        if(tot==total+x) return 1;
        return 0;
    }
    bool 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(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(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(dfs(1,1,0,i))
            {
                printf("%d
    ",i);
                return 0;
            }
        }
        return 0;
    }
    View Code
    I'm so lost but not afraid ,I've been broken and raise again
  • 相关阅读:
    iOS小技巧总结,绝对有你想要的
    Myeclipse for Mac快捷键
    iOS开发如何学习前端
    iOS应用支持IPV6,就那点事儿
    App Store审核被拒的23个理由
    43个优秀的Swift开源项目
    ExtJs组件之间的相互访问,访问机制
    hibernate or连接查询内容/criteria动态或连接查询/disjunction/其他查询条件
    hibernate如何解除关系———只删除多方保留一方
    java如何操作视图
  • 原文地址:https://www.cnblogs.com/sjymj/p/5904887.html
Copyright © 2011-2022 走看看