#include<bits/stdc++.h>
using namespace std;
int n,mp[31][31],flag;
int dir[4][4] = {{0,1},{0,-1},{1,0},{-1,0}};
bool vis[31][31];
//判断是否在墙内
bool in(int x,int y){
//上
for(int i = x;i>=0;i--){
if(mp[i][y] == 1) {
flag+=1;
break;
}
}
//下
for(int i = x;i<n;i++){
if(mp[i][y] == 1) {
flag+=1;
break;
}
}
//左
for(int i = y;i>=0;i--){
if(mp[x][i] == 1) {
flag+=1;
break;
}
}
//右
for(int i = y;i<n;i++){
if(mp[x][i] == 1) {
flag+=1;
break;
}
}
if(flag == 4) return true;
else return false;
}
void dfs(int x,int y){
if(x < 0 || y < 0 || x >= n || y >= n) return;
for(int i = 0;i<4;i++){
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(!vis[xx][yy] && mp[xx][yy] != 1){
vis[xx][yy] = 1;
mp[xx][yy] = 2;
dfs(xx,yy);
}
}
}
int main(){
cin >> n;
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
cin >> mp[i][j];
}
}
memset(vis,0,sizeof(vis));
for(int i = 1;i<n-1;i++){
for(int j = 1;j<n-1;j++){
flag = 0;
if(in(i,j) && mp[i][j] != 1){
//找到第一个在墙内的,进行dfs
mp[i][j] = 2;
vis[i][j] = 1;
dfs(i,j);
break;
}
}
}
for(int i = 0;i<n;i++){
cout << mp[i][0];
for(int j = 1;j<n;j++){
cout <<" "<< mp[i][j];
}
cout << endl;
}
return 0;
}
思路:
找到第一个在墙内的,开始dfs,不是围墙的全部染色