Skip to content

广搜理论基础

广搜适用场景

解决两点之间最短路径问题

但是如果需要把所有节点都遍历才能完成任务,那么广搜和深搜都是可以的。例如岛屿问题,遍历所有陆地,打上标记。

广搜的过程

感性来看就是一圈一圈进行搜索,每次搜索一定的方向,对搜索到的节点进行处理(如染色等),接着站在搜索到的节点进行下一次搜索。

代码框架

我们需要一个容器保留我们遍历过的元素,以便不会重复搜索节点(因为每次搜索的方向是固定的,有可能出现重复)。

这个容器可以是队列,也可以是栈,习惯上用队列比较方便

代码框架

cpp
定义4个方向
    gird 是地图-->二维数组
    visited 标记访问过的节点,不要重复访问,就是说遍历节点时要把该节点标记一下.
    x, y 代表开始搜索节点的下标
void bfs(gird,visited,x,y){
	    定义一个队列
        把第一个节点加入到队列中
        将这个节点标记为true
        遍历队列中元素
        从队列中取出元素
        计算当前元素坐标
        在此节点基础上进行四方向搜索:
            四方向搜索后的下个节点的坐标
            下个节点不能越界,不能被访问过,然后将下个节点添加到队列中
             加入队列立刻标记
        
}
cpp
int dif[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
// gird
// visited
void bfs(vector<vector<int>>& gird, vector<vector<int>>& visited,int x,int y){
	queue<pair<int,int>> que;
    que.push({x,y});
    visited[x][y] = true;
    while(!que.empty()){
        pair<int, int> node = que.top(); que.pop();
        int cur_x = node.first,cur_y = node.second;
        for(int i = 0;i < 4;i++){
            int next_x = curx + dir[i][0];
            int next_y = cury + dir[i][1];
            if(next_x < 0 || next_y < 0 || next_x >= gird.size() || next_y >= gird[0].size()) continue;
            if(visited[next_x][next_y] == false){
                que.push({next_x,next_y});
                visited[next_x][next_y] == true;
            }
        }
    }
}