题解:
先把题目给的n*n的矩阵外面加一圈0(不需要进行特殊操作,只需在读入的时候i=1,j=1即可),然后bfs(0,0)搜外围连通0的连通块,并标记上,这样圈内的0没标记的就输出2,圈外标记的0输出0;
- #include<bits/stdc++.h>
- using namespace std;
- const int N=40;
- typedef pair<int,int>PII;
- int dx[]={-1,1,0,0},dy[]={0,0,1,-1};
- int g[N][N],st[N][N];
- int n;
- void bfs(int x,int y)
- {
- queue<PII>q;
- q.push({x,y});
- st[x][y]=1;
- while(q.size())
- {
- auto t=q.front();
- q.pop();
- for(int i=0;i<4;i++)
- {
- int sx=t.first+dx[i],sy=t.second+dy[i];
- if(st[sx][sy])continue;
- if(sx<0||sx>n+1||sy<0||sy>n+1)continue;
- if(g[sx][sy]==1)continue;
- st[sx][sy]=1;
- q.push({sx,sy});
- }
- }
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=n;j++)
- {
- scanf("%d",&g[i][j]);
- }
- }
- bfs(0,0);
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=n;j++)
- {
- if(g[i][j]==1)
- printf("1 ");
- else if(g[i][j]==0&&st[i][j])//被标记属于圈外的输出0
- printf("0 ");
- else//没被标记的属于圈内
- printf("2 ");
- }
- printf("\n");
- }
- }