BFS广度优先搜素

目录

BFS与DFS区别:

练习:全球变暖

解题思路:


图的遍历BFS广度优先搜索 - 数据结构教程 - C语言网 (dotcpp.com)icon-default.png?t=N7T8https://www.dotcpp.com/course/149

BFS与DFS区别:

DFS利用栈,根据树的深度优先搜索,一路走到底,再通过回溯搜索最优解或全局解;

而BFS利用队,类似树的层级遍历,通过队的先入先出特点,标记每一步的下一步状态,通过入队出队模拟执行搜索过程(通常开辟一个Memory数组记录每个位置是否被搜索过)。DFS深度优先搜索与回溯算法_dfs算法怎么回溯-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_43855258/article/details/136070858

二叉树的遍历-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_43855258/article/details/135624865 

练习:全球变暖

解题思路:

step1.在海域中寻找未标记的连通岛屿for(for),遍历至未标记岛屿的起点[start_i,start_j]

step.2.岛屿数totoal_num++;

step3.BFS搜素,分别从上下左右4个方向vector<pair<int,int>> move={(-1.0),(+1,0),(0,-1),(0,+1)}搜索当前岛屿的连通状态,由queue<pair<int,int>> que的入队、出队模拟执行搜索过程,vector<vector<int>> memory 记录搜索状态,num记录位置(x,y)四周'#‘岛屿数,num=4则is_last=true当前岛屿没有完全覆盖-->存活岛屿数last_num++;

step4..重复step1.直至搜索结束。

# include <iostream>
# include <vector>
# include <queue>
using namespace std;

void debug_input(vector<vector<char>>& input, int& input_size){
    for(int i=0; i<input_size; i++){
        for(int j=0; j<input_size; j++){
            cout<<input[i][j];
        }
        cout<<endl;
    }
    cout<<endl;
}

class solution
{
private:
    vector<pair<int,int>> move;
    vector<vector<int>> memory; // 是否访问
    bool  BFS(vector<vector<char>>& input, int start_i, int start_j){
        bool is_last = false;
        queue<pair<int,int>> que;
        que.push(make_pair(start_i, start_j));
        memory[start_i][start_j] = 1;
        while(!que.empty()){
            int que_size = que.size();
            while(que_size--){
                auto cur_pos = que.front();
                que.pop();
                // 搜素current'#'四周(上下左右4点)
                int num = 0;
                for(int i=0; i<4; i++){
                    int x = cur_pos.first + move[i].first;
                    int y = cur_pos.second + move[i].second;
                    if(input[x][y] == '#'){
                        num++;
                        if(!memory[x][y]){
                            que.push(make_pair(x, y));
                            memory[x][y] = 1;   // 标记已搜查状态
                        } 
                    }
                }
                // current'#'四周均为'#',不会淹没
                if(num == 4) is_last = true;
            }
        }
        return is_last;
    }
    
public:
    solution(int& input_size){
        move.push_back(make_pair(-1,0));
        move.push_back(make_pair(1,0));
        move.push_back(make_pair(0,-1));
        move.push_back(make_pair(0,1));
        
        vector<int> vec(input_size, 0);
        memory.resize(input_size, vec);
    }
    
    int myslove(vector<vector<char>>& input, int& input_size){
        int total_num = 0, last_num = 0;
        // 找连通岛屿
        for(int i=0; i<input_size; i++){
            for(int j=0; j<input_size; j++){
                if(input[i][j] == '#' && !memory[i][j]){
                    total_num++;
                    // BFS搜素连通岛屿
                    if(BFS(input, i, j)) last_num++;
                }
            }
        }
        return total_num - last_num;
     }
};

int main()
{
    //input
    int input_size;
    char input;
    cin >> input_size;
    vector<vector<char>> vec;
    for(int i=0; i<input_size; i++){
        vector<char> tmp;
        for(int j=0; j<input_size; j++){
            cin>>input;
            tmp.push_back(input);
        }
        vec.push_back(tmp);
    }
    // // debug input
    // debug_input(vec, input_size);
    // solve
    solution res(input_size);
    cout<<res.myslove(vec, input_size)<<endl;
    
    return 0;
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值