填涂颜色
P1162 填涂颜色
P1162 填涂颜色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
输入格式
每组测试数据第一行一个整数n(1 \le n \le 30)n(1≤n≤30)
接下来nn行,由00和11组成的n \times nn×n的方阵。
方阵内只有一个闭合圈,圈内至少有一个00。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式
已经填好数字22的完整方阵。
输入输出样例
输入 #1
6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1
输出 #1
0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1
说明/提示
1 \le n \le 301≤n≤30
这题有点坑,就是如果墙壁把数字围起来,那那么多外围的0形成不了一个连通块,那就搜索不到全部了,问题就出在这里
6
0 0 1 1 1 0
1 1 1 0 1 0
1 0 0 0 0 1
1 1 0 1 1 1
0 1 0 1 0 0
0 1 1 1 0 0
就是这个样例
那怎么办呢
问题的关键就是想让所有的0变成一个连通块,那就变呗...扩大一圈,那必定连通,然后开始搜索
#include<iostream> using namespace std; const int N=50; int a[N][N]; int n; int dx[5]={0,-1,1,0,0}; int dy[5]={0,0,0,-1,1}; void dfs(int x,int y) { if(x<0||y<0||x>n+1||y>n+1||a[x][y]==1||a[x][y]==0) return ; a[x][y]=0; for(int i=1;i<=4;i++) dfs(x+dx[i],y+dy[i]); } int main(){ cin>>n; for(int i=0;i<=n+1;i++) { a[i][0]=2; a[i][n+1]=2; a[0][i]=2; a[n+1][i]=2; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; if(!a[i][j]) a[i][j]=2; } } /* for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } */ dfs(0,0);//从1,1点开始搜 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } return 0; }
#include<iostream> using namespace std; const int N=50; int a[N][N]; int n; void dfs(int x,int y) { if(x<0||y<0||x>n+1||y>n+1||a[x][y]||a[x][y]==-1) return ; a[x][y]=-1; dfs(x+1,y); dfs(x-1,y); dfs(x,y-1); dfs(x,y+1); } int main(){ cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; dfs(0,0); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]==-1) cout<<"0 "; if(!a[i][j]) cout<<"2 "; if(a[i][j]==1) cout<<"1 "; } cout<<endl; } return 0; }
bfs:
#include<iostream> #include<queue> using namespace std; typedef pair<int,int> PAII;//存坐标 int n; const int N=50; int s[N][N]; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; void bfs(int x,int y) { queue<PAII> q; q.push({x,y}); while(q.size()) { auto t=q.front(); q.pop(); int a=t.first,b=t.second; for(int i=0;i<4;i++) { int x1=a+dx[i]; int y1=b+dy[i]; if(x1>=0&&y1>=0&&x1<=n+1&&y1<=n+1&&!s[x1][y1]) { q.push({x1,y1}); s[x1][y1]=3; } } } } int main(){ cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>s[i][j]; bfs(0,0);//扩大一圈 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(s[i][j]==3) cout<<"0 "; else if(!s[i][j]) cout<<"2 "; else cout<<s[i][j]<<" "; } cout<<endl; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具