题目链接:https://www.luogu.com.cn/problem/P1162
题目描述:
解题思路:
从每个边界0出发,把里面的1当成障碍,因为边界的0肯定不在环里,用深度优先或者广度优先搜索,把能到位置在bk数组里全置1,遍历完后bk数组里的0就是环里的0,将它置2.
代码如下:
#include <bits/stdc++.h>
using namespace std;
int a[35][35];
int bk[35][35];
int f[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int n,px,py;
void dfs(int x,int y) {
if(bk[x][y]==1) {//优化 将上次走过的并且是边界上的0 结束
return ;
}
bk[x][y]=1;
for(int i=0; i<4; i++) {
int x1=x+f[i][0];
int y1=y+f[i][1];
if(x1>0&&y1>0&&x1<=n&&y1<=n&&bk[x1][y1]==0) {
dfs(x1,y1);
}
}
}
int main() {
int i,j;
cin>>n;
for(i=1; i<=n; i++) {
for(j=1; j<=n; j++) {
cin>>a[i][j];
bk[i][j]=a[i][j];
}
}
for(i=1; i<=n; i++) {
if(a[1][i]==0) {
dfs(1,i);//第一行的0
}
if(a[i][1]==0) {
dfs(i,1);//第一列的0
}
}
for(i=1; i<=n; i++) {
if(a[i][n]==0) {
dfs(i,n);//最后一列的0
}
if(a[n][i]==0) {
dfs(n,i);//最后一行的0
}
}
for(i=1; i<=n; i++) {
for(j=1; j<=n; j++) {
if(a[i][j]==0&&bk[i][j]==0) {//将原数组和遍历完的数组对比
cout<<"2"<<" ";
} else {
cout<<a[i][j]<<" ";
}
}
cout<<endl;
}
return 0;
}