天天看点

搜索(深度优先搜索和广度优先搜索)

搜索中比较基础也比较重要的就两种 广搜(BFS)和深搜(DFS)

其实搜索可以理解为一种高级的暴力(遍历所有的点),简单的说就是从一个点开始搜索所有可能到达的点

一. 深度优先搜索

可以分为两种一种用递归一种不用递归(不用递归的比较麻烦就不给大家讲了)

首先递归应该都很清楚,不清楚的同学们可以看看下面的这篇文章(讲解的很清楚)https://blog.csdn.net/sinat_38052999/article/details/73303111

主要过程

1.先从一个点出发,不断地走,直到不能走的点或者中点

2.遇到不能走的点时就回到上一个点继续尝试其他的点

一个模板版帮助大家理解:

int dfs(step(步数)和 初始点信息){
	if(找到解(终止条件) || 无法继续走下一步(边界条件)){
		...
		return;
	}
	枚举下一种情况,dfs(step+1);
} 
//和递归比较像
           

一. 广度优先搜索

要用到队列的知识,不知道的同学看这里 (讲解的也是非常清楚)https://blog.csdn.net/lym152898/article/details/52202606

主要过程:

1.将初始点加入队列。

2.判断队列不为空。

3.将于队首相邻的点加入队列,直到找到目标点。

一个模板供大家理解:

int bfs(){
	先初始化队列a
	a={起点s};
	标记s;
	while(a非空){
		取a队首元素u;
		U出队;
		if(u ==目标状态){
		.....
		}
		与u相邻且访问的点进入队列;
		标记u为已访问;
	}
}
           

继续阅读