做题笔记 DFS深搜(洛谷P1162填涂颜色)

题目传送门 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值