Codevs 1049 棋盘染色
题目描述 Description
有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少。读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块。(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接)
输入描述 Input Description
输入包括一个5×5的01矩阵,中间无空格,1表示格子已经被染成黑色。
输出描述 Output Description
输出最少需要对多少个格子进行染色
样例输入 Sample Input
11100
11000
10000
01111
11111
样例输出 Sample Output
1
这个题是不是不能用BFS做呀?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int ans=0x7fffffff; bool vis[10][10],color[10][10],now[10][10]; int e[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; bool V[10][10]; int cnt,fr,num; struct node{ int u,v; }point[30]; bool check(int nx,int ny){ V[nx][ny]=1;cnt++; for(int i=0;i<4;i++){ int x=nx+e[i][0],y=ny+e[i][1]; if(x<=5&&x>=1&&y<=5&&y>=1){ if(now[x][y]&&!V[x][y]) check(x,y); } } } void dfs(int step){ if(step>ans)return; memset(V,0,sizeof(V)); cnt=0; int nx=0,ny=0;//找一个黑格子 for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++) if(now[i][j]==1){ nx=i,ny=j; break; } if(nx&&ny)break; } check(nx,ny); if(cnt==step+fr)ans=min(ans,step); for(int i=1;i<=num;i++){ int x=point[i].u,y=point[i].v; if(!now[x][y]){ now[x][y]=1; dfs(step+1); now[x][y]=0; } } } char ch[10]; int main(){ freopen("Cola.txt","r",stdin); for(int i=1;i<=5;i++){ scanf("%s",ch+1); for(int j=1;j<=5;j++){ color[i][j]=ch[j]-'0'; now[i][j]=color[i][j]; if(color[i][j])fr++; if(!color[i][j]){ point[++num].u=i; point[num].v=j; } } } dfs(0); printf("%d",ans); }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战