P1162 填涂颜色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1162
运用深度优先搜索,具体解释见代码注释
可以先用P 1506练手
//P1162 填涂颜色
/*
举例子
输入时 b为 1 1 1 1 1 a为 2 2 2 2 2
0 0 1 0 1 0 0 2 0 2
0 0 1 0 1 0 0 2 0 2
0 1 0 0 1 0 2 0 0 2
0 1 1 1 1 0 2 2 2 2
dfs后 b为 1 1 1 1 1 a为 2 2 2 2 2
0 0 1 0 1 1 1 2 0 2
0 0 1 0 1 1 1 2 0 2
0 1 0 0 1 1 2 0 0 2
0 1 1 1 1 1 2 2 2 2 (a中不为0的即是墙或者被搜索过的)
实际输出应该为
1 1 1 1 1
0 0 1 2 1
0 0 1 2 1
0 1 2 2 1
0 1 1 1 1
与a相比相当于 2→1 1→0 0→2 或者看作
a的0→2 其他的均与b相同
这样写可以用来分辨哪些是在外面的0在dfs后变成了1 哪些是里面的0
*/
#include <bits/stdc++.h>
int dir[4][2]={
{0,-1},
{0, 1},
{1, 0},
{-1,0}
};
int n;
int a[32][32];
int b[32][32];
void dfs(int i,int j){
// 不能是i<1||i>n||j<1||j>n
// 因为dfs从 (0,0)开始,否则一开始就越界
// 因为(0,0)不在范围内
// 所以dfs只会一直的return而不会进行实质性操作
if(i<0||i>n+1||j<0||j>n+1||a[i][j]!=0) return;
a[i][j]=1;
for(int t=0;t<4;t++){
//选择4个方向
dfs(i+dir[t][0],j+dir[t][1]);
}
}
using namespace std;
int main(){
cin>>n;
//输入信息
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>b[i][j];
if(b[i][j]==0) a[i][j]=0;
else a[i][j]=2;
}
}
dfs(0,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0) cout<<"2"<<" ";
else cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
P1506 拯救oibh总部 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1506
//P1506 拯救oibh总部
#include<bits/stdc++.h>
using namespace std;
#define N 500
int dir[4][2]{
{0,1},
{0,-1},
{1,0},
{-1,0}
};
int x,y;
int oibh[N+2][N+2];
void dfs(int p,int q){
if(p<0||p>x+1||q<0||q>y+1||oibh[p][q]==1) return ;
oibh[p][q]=1;
for(int i=0;i<4;i++){
dfs(p+dir[i][0],q+dir[i][1]);
}
}
int main(){
cin>>x>>y;
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
char c;
cin>>c;
if(c=='0') oibh[i][j]=0;
else oibh[i][j]=1;
}
getchar();
}
dfs(0,0);
int count=0;
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
if(oibh[i][j]==0)
count++;
}
}
cout<<count<<endl;
return 0;
}