P1162 填涂颜色
Tips:用dfs:从左上角的零开始深搜遍历,把所有能走过的零标记一下,遇到围墙(1)或者越界就return。
注:1.会存在左上角为1的情况,因此存数据A[i][j]时下标从为1~N,然后从A[0][0]开始遍历(假设外面的多一层0)。 2.会出现以下情况
1 1 1 1 1
1 0 0 1 1
1 1 1 0 0
如果越界判别标准是>N。显然左下角的两个0遍历不到, 不符合题目要求,因此判别标准为>N+1(假设最右边和最下边还有一层零)。
代码如下(示例):
#include <bits/stdc++.h>
using namespace std;
int N,A[55][55];
bool Flag[55][55];
int Dx[5]={0,-1,1,0,0};
int Dy[5]={0,0,0,-1,1};
void DFS(int i,int j){
//越界
if(i<0||j<0||i>N+1||j>N+1) return ;
//遍历过或者为1
if(Flag[i][j]==true||A[i][j]==1) return;
Flag[i][j]=true;
for(int nx=1;nx<=4;nx++) DFS(i+Dx[nx],j+Dy[nx]);
return ;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>N;
//最外面的零层都是零(相当于在外面套一圈)
//避免从左上角开始时是1
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]&&Flag[i][j]==false) cout<<2<<" ";
else cout<<A[i][j]<<" ";
}
cout<<endl;
}
return 0;
}