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; } } }
时间: 2024-10-12 15:34:06