一、宽度优先搜索(BFS)
宽度优先搜索的策略为优先遍历访问邻居,在实际的应用中一般用来解决最优解问题。在宽度优先搜索的时候,一般使用队列来完成先进先出功能。首先需要确定初始状态,然后通过状态的扩展找到结束状态,抛弃非法状态,完成问题求解。
1.1 基本思路
BFS方法的基本思路如下:
void BFS(int s){
queue<int> q;
q.push(s);
while(!q.empty()){
int t = q.front(); //取出队首元素
// 访问队首元素
q.pop(); //队首元素出队
// 下一层节点入队,置标志为已经访问
}
}
1.2 问题应用
BFS 可以用来解决最基础的树(图)的遍历问题,以及迷宫问题的最小步数(代价),还有矩阵中特定 “块” 的个数。
还会有一些题表面看起来和宽度优先搜索无关,但是实际的求解方法仍然是BFS法,如果这些问题中所有的状态之间的转变规律可以用树的方法表示,且一般搜索此树中满足要求且层高最小的节点,可以直接用BFS方法。
i.e. 玛雅人的密码中对字符串的每一次移动都是以初始字符串为根的一个完整的层,而且要求最少的次数,用BFS方法。
二、 深度优先搜索
深度优先搜索的策略为优先访问孩子节点,在实际的应用中可以用来解决是否存在解问题,最优解问题一般通过BFS实现。在深度优先搜索的时候,一般用栈或者递归来实现,因为递归的写法相对来说较为简洁,所以通常用递归的方法写DFS。
2.1 基本思路
深度遍历基本思路如下:
void DFS(int status){
if(status == need){
return;
} //程序出口
else{
//判断访问是否合法
// 按照访问规则依次访问
visit[a[status]] = true; //方便回溯
DFS(status + 1); //递归访问
visit[a[status]] = false; //回溯到上一层
}
}
2.2 问题运用
深度遍历可以用来解决树(图)的平凡遍历问题,n皇后问题,背包问题等。