CODEVS——T 1049 棋盘染色

时间:2023-12-17 13:50:50

http://codevs.cn/problem/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

数据范围及提示 Data Size & Hint
迭代加深搜索
枚举每次染色的格子数,使用完所有次数后,遍历全图统计黑格子联通的个数
染色时,可以从左上,向右下 依次进行
 #include <cstring>
#include <cstdio> char s[][];
int ans,tot,cnt,map[][]; bool vis[][];
int sx,fx[]={,,,-};
int sy,fy[]={,,-,}; void Traversal(int x,int y)
{
++tot;vis[x][y]=;
for(int xx,yy,i=; i<; ++i)
{
xx=x+fx[i]; yy=y+fy[i];
if(!vis[xx][yy]&&xx>=&&xx<&&yy>=&&yy<&&map[xx][yy])
Traversal(xx,yy);
}
} bool DFS(int x,int y,int now)
{
if(!now)
{
tot=;
memset(vis,,sizeof(vis));
Traversal(sx,sy);
return (ans+cnt)==tot;
}
for(int yy=y+; yy<; ++yy)
{
if(map[x][yy]) continue;
map[x][yy]=;
if(DFS(x,yy,now-)) return ;
map[x][yy]=;
}
for(int xx=x+; xx<; ++xx)
for(int yy=; yy<; ++yy)
{
if(map[xx][yy]) continue;
map[xx][yy]=;
if(DFS(xx,yy,now-)) return ;
map[xx][yy]=;
}
return ;
} int Presist()
{
for(int i=; i<; ++i)
scanf("%s",s[i]);
for(int i=; i<; ++i)
for(int j=; j<; ++j)
{
map[i][j]=s[i][j]-'';
if(map[i][j]) cnt++,sx=i,sy=j;
}
for(; !DFS(,,ans); ) ans++;
printf("%d\n",ans);
return ;
} int Aptal=Presist();
int main(){;}