题目传送门 P1162填涂颜色
这道题目在洛谷训练场上分类是BFS广度优先搜索,但是由于我只学了DFS,所以只能用DFS做了(好像DFS做更简单…)
这道题思路如下:
1. 定义两个二维数组,一个用来输入,另一个用来操作,不然不好输出
2. 从(0,0)开始dfs,越界或者不等于0(不等于0就是撞墙了)就退出,否则将该点置为1(其实就相当于染色)
3. 输出时如果依旧为0的(未染色的说明没有搜到,也就是被1给围住了),输出2,否则输出原数组
我们来看代码
#include<iostream>
using namespace std;
int fz[35][35],n,a[35][35]; //fz是用来输入的,a用来操作
int fx[5]={0,0,0,1,-1},fy[5]={0,1,-1,0,0}; //四个方向,第一个(0,0)不需要的
void dfs(int x,int y){ //dfs函数(主要内容)
if(x>n+1||x<0||y>n+1||y<0||a[x][y]!=0){return ;} //判断是否越界,是否是墙,是否搜过
a[x][y]=1; //置为1,代表搜索过了
for(int i=1;i<=4;i++){
dfs(fx[i]+x,fy[i]+y); //换个方向继续搜
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>fz[i][j];
if(fz[i][j]==0) a[i][j]=0; //先将可操作空间置为0
else a[i][j]=2; //墙置为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<<" "; //依然是0表示没有搜过,也就是被1围住了,这里就输出2
else cout<<fz[i][j]<<" ";
}
cout<<endl; //一定要换行
}
return 0;
}
已经有两道DFS了,我争取下一期做题笔记更新BFS的题
END