深搜简介&例题

深度优先搜索介绍&例题 - 智灵基础班

注意:本贴的所有代码都请勿抄袭,违者后果自负!

本帖的做头代码均为模版题的代码,作业中均无对应的题目

不是很简的简介

深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法。在C++中实现深度优先搜索通常使用递归方法,但也可以使用栈来实现非递归版本。DFS算法沿着树的深度遍历树的节点,尽可能深地搜索树的分支。

基本思想

  • 从一个节点开始,探索尽可能深的分支,直到达到叶子节点。
  • 当节点v的所有出边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。
  • 这个过程一直进行到已发现从原始节点可达的所有节点为止。

实现步骤

  1. 选择起始节点:选择一个节点作为搜索的起始点。
  2. 访问节点:访问该节点,并标记该节点为已访问。
  3. 寻找邻接节点:查找当前节点的所有未被访问的邻接节点。
  4. 递归搜索:对每个未被访问的邻接节点,递归执行步骤2和3。
  5. 回溯:如果所有邻接节点都已被访问,回溯到上一个节点。

应用

深度优先搜索在许多领域有应用,包括:

  • 路径搜索和求解
  • 迷宫问题
  • 图的连通性问题
  • 拓扑排序
  • 解决数独问题
  • 网络爬虫

DFS是探索和理解图结构的基础算法之一。

下面是例题部分

例题1:迷宫解法

#include<bits/stdc++.h>
using namespace std;
void dfs(坐标x,坐标y){
	if(找到目标点){
		计数;
	}
	else{
		for(遍历4个方向){
			记录新位置;
			if(新位置未被标记&&新位置没有越界&&新位置不是墙){
				标记新位置;
				dfs(新位置的坐标);
				回溯,清除标记;
			}
		}
	}
}
int main(){
	dfs(起点坐标);
	return 0;
}
AC代码


《AC代码》

例题2:洪水填充



#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans=0;
char a[25][25];
bool vis[25][25];//标记数组
void f(int x,int y){
	if() return;//判断条件是否合法,不合法就跳出
	//标记位置
	//能到的地方+1
	//遍历四个方向
}
int main(){
	memset(vis,false,sizeof(vis));
	cin>>n>>m;
	int sx,sy;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
                        //设置开始坐标
		}
	}
	//开始递归
	cout<<ans;//输出结果
	return 0;
}
例题3:八连通

这也属于一个洪水填充问题,即遍历整个数组,发现有空地就把连通的空地都填充起来,最后看一下填充了几片空地

#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans=0;
char a[105][105];
//两个方向数组

bool jc(int x,int y){                 //判断边界是否合法的函数

}
void dfs(int x,int y){
	if() return;  //判断当前位置
	//标记当前位置
	for(int i=0;i<8;i++){//遍历8个方向
		int nx=x+dx[i];//计算新位置
		int ny=y+dy[i];
		if ){//检查
			//递归
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}	
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='W'){
				dfs(i,j);
				ans++;
			}
		}	
	}
	
	cout<<ans;
	return 0;
}

创作不易,点个赞吧

image
2024.7.16 20:00更新:取消了所有的AC代码,改为了伪代码

3 个赞