首页 > 其他分享 >BFS广度优先

BFS广度优先

时间:2024-12-18 21:20:47浏览次数:3  
标签:优先 判断 int 流动 BFS vector grid 广度 上下左右

个人最喜欢的算法之一,这是一种犹如洪水般的算法,O(n)的时间复杂度。

##红色不可流动 ,橙色可流动,黄色所在点,蓝色在队列里。

就像洪水一样,当你得到某个位置时候,开始判断它的上下左右是否可流动并判断有没有流过。

 

开始判断它的上下左右是否可流动并判断有没有流过,若可以放入上下左右可流动的位置。

接下来把queue中的位置取出来,开始判断它的上下左右是否可流动。

开始判断它的上下左右是否可流动并判断有没有流过,若可以放入上下左右可流动的位置。

接下来把queue中的位置取出来,开始判断它的上下左右是否可流动。

开始判断它的上下左右是否可流动并判断有没有流过,若可以放入上下左右可流动的位置。

接下来把queue中的位置取出来,开始判断它的上下左右是否可流动。

开始判断它的上下左右是否可流动并判断有没有流过,若可以放入上下左右可流动的位置。

接下来把queue中的位置取出来,开始判断它的上下左右是否可流动。

。。。。。。。。。。。。

直到队列空了,放不了东西了。一起结束了

模板 4方向制 :

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

// 定义方向数组,表示上下左右四个方向
int dx[4] = { -1, 1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };

// 检查坐标 (x, y) 是否在网格范围内且是可通行的
bool isValid(int x, int y, int n, int m, vector<vector<int>>& grid, vector<vector<bool>>& visited) {
    return (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 1 && !visited[x][y]);
}

void bfs(int startX, int startY, int n, int m, vector<vector<int>>& grid) {
    queue<pair<int, int>> q;
    vector<vector<bool>> visited(n, vector<bool>(m, false));

    q.push({startX, startY});
    visited[startX][startY] = true;

    while (!q.empty()) {
        auto [x, y] = q.front();
        q.pop();

        // 处理当前节点 (x, y)
        cout << "Visiting node: (" << x << ", " << y << ")" << endl;

        // 遍历四个方向
        for (int i = 0; i < 4; ++i) {
            int newX = x + dx[i];
            int newY = y + dy[i];

            if (isValid(newX, newY, n, m, grid, visited)) {
                q.push({newX, newY});
                visited[newX][newY] = true;
            }
        }
    }
}

int main() {
    int n = 5, m = 5; // 网格大小
    vector<vector<int>> grid = {
        {1, 0, 1, 1, 1},
        {1, 1, 0, 1, 0},
        {0, 1, 1, 0, 1},
        {1, 0, 1, 1, 1},
        {1, 1, 1, 0, 1}
    };

    int startX = 0, startY = 0; // 起始点
    bfs(startX, startY, n, m, grid);

    return 0;
}

 

标签:优先,判断,int,流动,BFS,vector,grid,广度,上下左右
From: https://www.cnblogs.com/AnnaStore/p/18615862

相关文章

  • Cheese Aizu - 0558 (BFS)
    题目链接:https://vjudge.net/problem/Aizu-0558#author=GPT_zh题意:给你一个h*w的矩阵,(.代表空地。X代表障碍物,数字1~n分别代表n个不同的cheese)老鼠从起始位置S开始,挨个去找和它能力值(power)相等的cheese去吃,输出吃完n个cheese所需要的步长。思路:BFS搜索,即先找和power相同的c......
  • 每日一道算法题之宽度优先遍历之地图分析
    classSolution{publicintmaxDistance(int[][]grid){//思路:宽度优先遍历。//第一层有一个或者多个。单源+多源。//遍历到每一层的时候,看当前层有多少个数,然后就操作多少次。intm=grid.length;intn=grid[0].len......
  • CSS选择器有哪些,它们的优先级如何
    1.CSS选择器类型1.1基础选择器CSS基础选择器包括标签选择器、类选择器、ID选择器和属性选择器,它们是最常用的选择器类型。标签选择器:根据HTML标签名称选择元素,例如div、p、span等。这类选择器的目标是页面中所有具有指定标签名的元素。类选择器:使用点号.加上类名来选......
  • 优先队列
    P1090[NOIP2004提高组]合并果子/[USACO06NOV]FenceRepairG以此题为例,进行优先队列的基本使用AC代码//优先队列#include<bits/stdc++.h>usingnamespacestd;intn,x,ans;priority_queue<int,vector<int>,greater<int>>m;//优先队列的创建,并且数字从小到大排序,如......
  • 如何设置 Windows 11/10 网卡优先级(网卡顺序)
    在Windows11和Windows10系统中,网络适配器(也称为网卡或NIC)用于将计算机连接到互联网或局域网。如果你使用笔记本电脑,可能同时拥有无线和有线网卡,在Windows11中会被分别标识为Wi-Fi(WLAN)和以太网(LAN)。如果你的Windows设备配备了4G或5G模块,还可能会有蜂窝网络(移动......
  • 同优先级时间片运行
    目录设计原理设计实现优先级更高的任务具有更高的CPU使用权优先级相同的任务轮流占用CPU使用设计原理保证同一优先级任务之间公平占用CPU同一优先级任务间:指针不动,表头任务时间片用完后,取出表头插入表尾,循环轮转。设计实现构建一个允许多任务具备相同优先级,且同......
  • 数据结构结课设计——使用随机深度优先搜索完成随机迷宫的生成
     博主在本学期的c语言数据结构课程选择了随机迷宫生成作为结课设计,并运用随机深度优先,下面是我的代码设计思路与代码,  设计思路上迷宫的随机生成问题可以分成两个大步骤来进行:第一步迷宫的随机初始化:通过二维数组来对迷宫进行表示,将迷宫全部设置为1,再通过随机函数将迷宫......
  • 一篇入门广度优先搜索BFS
    注:本篇博客参考《算法图解》,读者阅读BFS一篇时大受启发所以想要记录下来并搭配例题给网友分享。BFS解决的问题从节点A出发,有前往节点B的路径吗?从节点A出发,前往节点B的哪条路径最短?应用:图的遍历搜索,最短路径,层级遍历,网络爬虫等一个例子+一个例题搞懂BFS把人和人的关......
  • 为什么要优先选择html5开发移动应用?
    选择HTML5开发移动应用有几个优势,使得它在某些情况下成为优先选择:跨平台兼容性:HTML5应用可以在各种平台上运行,包括iOS、Android、WindowsPhone等,只需编写一次代码,即可在多个平台部署,节省开发时间和成本。避免了为每个平台分别开发原生应用的需要。低开发成本:......
  • 【Linux】进程的状态和进程优先级
    进程状态进程状态的名词解析新建:字面意思重新创建一个进程,但是这个进程的test_struct还没有加载到运行队列中此时的状态成为新建。运行:进程的test_struct结构体被加载到可执行队列中。         阻塞:等待非CPU资源的就绪时的状态就叫做阻塞。    ......