codevs——1049 棋盘染色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs——1049 棋盘染色相关的知识,希望对你有一定的参考价值。

1049 棋盘染色

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
题目描述 Description

有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少。读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块。(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接)

输入描述 Input Description

   输入包括一个5×5的01矩阵,中间无空格,1表示格子已经被染成黑色。

输出描述 Output Description

输出最少需要对多少个格子进行染色

样例输入 Sample Input

11100

11000

10000

01111

11111

样例输出 Sample Output

1

 

枚举染色的格子数,如果当前染色的个数可以满足是黑色格子连成一片,即为最终答案。

在dfs里面我们需要搜索染色的位置,然后最终判断是否合格,合格条件:能够连成一片的格子的个数等于染色的个数+总黑格的个数

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100
using namespace std;
char ch;
bool vis[N][N];
int a[N][N],cnt,tot,sx,sy,ans;
int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};
int pd(int x,int y)
{
    tot++;vis[x][y]=true;
    for(int i=0;i<4;i++)
    {
        int fx=x+xx[i],fy=y+yy[i];
        if(!vis[fx][fy]&&fx>0&&fy>0&&fx<=5&&fy<=5&&a[fx][fy])
         pd(fx,fy);
     } 
}
int dfs(int x,int y,int now)
{
    if(!now)
    {
        tot=0;
        memset(vis,0,sizeof(vis));
        pd(sx,sy);
        return (cnt+ans)==tot;
    }
    for(int fy=y+1;fy<=5;fy++)
    {
        if(a[x][fy]) continue;
        a[x][fy]=true;
        if(dfs(x,fy,now-1)) return 1;
        a[x][fy]=false;
    }
    for(int fx=x+1;fx<=5;fx++)
     for(int fy=1;fy<=5;fy++)
      {
           if(a[fx][fy]) continue;
           a[fx][fy]=true;
           if(dfs(fx,fy,now-1)) return 1;
           a[fx][fy]=false;
      }
      return 0;
}
int main()
{
    for(int i=1;i<=5;i++)
    {
        for(int j=1;j<=5;j++)
         {
             scanf("%c",&ch);
             a[i][j]=ch-0;
             if(a[i][j]) sx=i,sy=j,cnt++;
          } 
        if(i!=5) scanf("\n");
     } 
    for(ans=1;;ans++)
    {
        if(dfs(1,1,ans))
        {
            printf("%d",ans);
            return 0;
        }
    }
}

 

以上是关于codevs——1049 棋盘染色的主要内容,如果未能解决你的问题,请参考以下文章

codevs——1049 棋盘染色

CODEVS——T 1049 棋盘染色

CODEVS1049 棋盘染色

[Codevs] 1014 棋盘染色

[CodeVs1050]棋盘染色2(状态压缩DP)

Codevs1922骑士共存问题(最小割,二分图最大匹配)