P1162 填涂颜色
P1162 填涂颜色
- 分析:根据题意,将由1组成的闭合圈内的所有数字改为0。因为是一个正方形矩阵,所以需要设定四个方位,设一个标记数组,先复制一份原数(原来是1就自动标记为1),从4个边缘开始找0,搜索过程中0标记为-1,然后在限定范围内进行搜索,如果遇到已标记的数,证明是1 撞到墙了或者已搜过了,全部搜索完之后就变成了除了闭合圈以内的0,其余所有数字都标记为了1或-1,最后将闭合圈以内的0以2的形式输出,其他按照原来的数输出。
-
#include<cstdio> #include<iostream> #include<queue> using namespace std; int n,a[31][31],b[31][31]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; struct node { int x,y; }now; void bfs(int x,int y) { queue<node> q; q.push({x,y}); while(!q.empty()) { now=q.front(); q.pop(); b[now.x][now.y]=-1;//已搜过 标记 for(int i=0;i<4;i++)//四个方向搜索 { int xx=now.x+dx[i]; int yy=now.y+dy[i]; if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&b[xx][yy]>=0&&a[xx][yy]==0) {//符合题意 q.push({xx,yy});//新点放入队尾 b[xx][yy]=-1;//并标记 } } } } int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; b[i][j]=a[i][j]; } } //从四个边缘找0 for(int i=1;i<=n;i++) if(a[1][i]==0) bfs(1,i);//第一行 for(int i=1;i<=n;i++) if(a[i][1]==0) bfs(i,1);//第一列 for(int i=1;i<=n;i++) if(a[n][i]==0) bfs(n,i);//最后一行 for(int i=1;i<=n;i++) if(a[i][n]==0) bfs(i,n);//最后一列 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(b[i][j]==-1) cout<<0<<" ";//在外面的0 else if(b[i][j]==0) cout<<2<<" ";//被包裹的0 else cout<<b[i][j]<<" ";//剩余的1 } cout<<endl; } return 0; } - 还有个代码是跟面积那题写的基本一样的,没从四个边缘搜索,是在矩阵外面加了一圈0。
- 但是.....在洛谷通过 在码学堂错一个数据......
-
#include<cstdio> #include<iostream> #include<queue> using namespace std; int n,a[31][31],b[31][31]; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; struct node { int x,y; }now; void bfs(int x,int y) { queue<node> q; q.push({x,y}); while(!q.empty()) { now=q.front(); q.pop(); for(int i=0;i<4;i++)//四个方向搜索 { int xx=now.x+dx[i]; int yy=now.y+dy[i]; if(xx>=0&&xx<=n+1&&yy>=0&&yy<=n+1&&b[xx][yy]==0&&a[xx][yy]==0) {//符合题意 q.push({xx,yy});//新点放入队尾 b[xx][yy]=1;//并标记 } } } } int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; b[i][j]=a[i][j]; } } //b[0][0]=1; bfs(0,0); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(b[i][j]==0) cout<<2<<" ";//被包裹的0 else cout<<a[i][j]<<" ";//剩余的1 } cout<<endl; } return 0; }

浙公网安备 33010602011771号