XJOI2018提高组训训练21

估计得分:70+100+0+0+0

实际得分:0+100+10+20+0

T1 棋盘染色

题目描述:

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

输入格式:

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

输出格式:

输出最少染色次数

样例输入:

11100
11000
10000
01111
11111

样例输出:

1

时间限制:

1000
估计得分:70
实际得分:0
失分原因:读入时使用scanf读入,出现异常错误,以后关于字符串的读入在不超时情况下尽量使用cin读入
题解:
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;

const int dx[10]={0,-1,1,0,0};
const int dy[10]={0,0,0,-1,1};

int a[10][10];
int p[10][10];
bool totans;
int colornum;
int top=0;
char c;

void del(int x,int y)
{
    p[x][y]=0;
    int i,tx,ty;
    for(i=1;i<=4;i++)
       {tx=x+dx[i]; ty=y+dy[i];
        if(tx<1||ty<1||tx>5||ty>5||!p[tx][ty]) continue;
        del(tx,ty);
       }
}

bool check()
{
    int tag=0,i,j;
    for(i=1;i<=5;i++)
    for(j=1;j<=5;j++)
       p[i][j]=a[i][j];
    for(i=1;i<=5;i++)
    for(j=1;j<=5;j++)
       {if(p[i][j])
           {if(tag==0)
               {del(i,j); tag=1;}
            else return false;
           }
       }
    return true;
}

void dfs(int x,int k,int xx,int yy){
     if(k==x)
       {if(check()) totans=1;
        return ;
       }
    if(totans||xx==6) return ;
    for (int i=yy;i<=5;i++){
        if(a[xx][i]) continue;
        a[xx][i]=1;
        if(i==5) dfs(x+1,k,xx+1,1);
        else dfs(x+1,k,xx,i+1);
        a[xx][i]=0;
    }
    for (int i=xx+1;i<=5;i++){
        for (int j=1;j<=5;j++){
            if(a[i][j]) continue;
            a[i][j]=1;
            if(j==5) dfs(x+1,k,i+1,1);
            else dfs(x+1,k,i,j+1);
            a[i][j]=0;
        }
    }
}

int main(){
    int n;
    //scanf("%d",&n);
    for (int i=1;i<=5;i++){
        for (int j=1;j<=5;j++){
          cin>>c;
           a[i][j]=c-'0';
           if(a[i][j]==1) top++;
        }
        c=getchar();
    }
    for (int i=0;i<=25;i++){
    dfs(0,i,1,1);
    if(totans) {
        printf("%d\n",i);
        return 0;
      }
    }
return 0;
}

猜你喜欢

转载自www.cnblogs.com/lmjer/p/9550334.html