码迷,mamicode.com
首页 > 其他好文 > 详细

codevs——1049 棋盘染色

时间:2017-09-20 19:36:39      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:namespace   cst   需要   包括   结果   描述   并且   out   anim   

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 棋盘染色

标签:namespace   cst   需要   包括   结果   描述   并且   out   anim   

原文地址:http://www.cnblogs.com/z360/p/7562794.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!