首页 > 其他分享 >BFS

BFS

时间:2024-07-29 11:31:56浏览次数:9  
标签:int BFS while && push path include

/**
 * BFS模板套路
 * 1. 将初始状态加入队列queue
 * 2. while queue不空
 * 3. {
 *          3.1 t <- 队头(每次将队头拿出来)
 *          3.2 扩展队头
 *     }
 */

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <stack>
using namespace std;

typedef pair<int, int> PII;
const int N = 110;
int m, n;
int g[N][N], d[N][N];
int dx[4] = { -1, 1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };
//PII Prev[N][N];//打印路径使用,记录前一个点是哪个
//stack<PII> path;//打印路径使用,用于顺序输出路径

int bfs() {
    memset(d, -1, sizeof(d));
    queue<PII> q;
    d[0][0] = 0;
    q.push({ 0, 0 });

    while (!q.empty()) {
        auto t = q.front();
        q.pop();
        for (int i = 0; i < 4; ++i) {
            int x = t.first + dx[i], y = t.second + dy[i];
            if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1) {
                d[x][y] = d[t.first][t.second] + 1;
                q.push({ x, y });
                //Prev[x][y] = t;//打印路径使用, 记录x,y这个点是从t这个点过来的
            }
        }
    }
    // // 打印路径使用
    // int x = n - 1, y = m - 1;
    // while (x || y) {
    //     path.push({x, y});
    //     auto t = Prev[x][y];
    //     x = t.first, y = t.second;
    // }
    // path.push({x, y});
    // while (!path.empty()) {
    //     auto node = path.top();
    //     cout << node.first << ' '<< node.second << endl;
    //     path.pop();
    // }

    return d[n - 1][m - 1];
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            cin >> g[i][j];

    cout << bfs() << endl;
    return 0;
}

标签:int,BFS,while,&&,push,path,include
From: https://www.cnblogs.com/windzhao6/p/18329703

相关文章

  • 怎么练习BFS?题单给您列好啦!
    前面是介绍,后面是题单哦,准备了两份,要是链接失效可以按照第一份搜题。BFS广度优先搜索(Breadth-First-Search)广度优先搜索算法(BreadthFirstSearch),又称为"宽度优先搜索",BFS是用于图的查找算法(要求能用图表示出问题的关联性)。BFS可用于解决2类问题:1.从A出发是......
  • 迷宫出口1430 BFS
    题目test40001011011110000114340001011011110000142430110011001133BFS解法一.什么是BFS?这一节是给不了解BFS同学看的,会的可以跳过(๑╹◡╹)ノ"“”。这层层往外扩散的玩意叫黏菌,没有脑子会走迷宫!!!......
  • 【普及组】广度优先搜索BFS——到达型搜索问题_C++算法竞赛
    文章目录1.走迷宫例1.洛谷B3625迷宫寻路例2.洛谷P1825[USACO11OPEN]CornMazeS例3.[ABC348D]MedicinesonGrid(AtCoder)2.生活背景下的常见问题例.P3958[NOIP2017提高组]奶酪3.输出路径例.洛谷P6207[USACO06OCT]CowsonSkatesGEnd提示:本文建议有一定......
  • 如何建立一颗二叉树?(数据结构:树 + hash表 / 广搜BFS)
    一个二叉树,树中每个节点的权值互不相同。现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。输入格式第一行包含整数 N,表示二叉树的节点数。第二行包含 N 个整数,表示二叉树的后序遍历。第三行包含 N 个整数,表示二叉树的中序遍历。输出格式输出一行 N 个整数,......
  • 【C++BFS 回溯】756. 金字塔转换矩阵
    本文涉及知识点C++BFS算法C++回溯LeetCode756.金字塔转换矩阵你正在把积木堆成金字塔。每个块都有一个颜色,用一个字母表示。每一行的块比它下面的行少一个块,并且居中。为了使金字塔美观,只有特定的三角形图案是允许的。一个三角形的图案由两个块和叠在上面的单......
  • 图——图的遍历(DFS与BFS算法详解)
    前面的文章中我们学习了图的基本概念和存储结构,大家可以通过下面的链接学习:图的定义和基本术语图的类型定义和存储结构这篇文章就来学习一下图的重要章节——图的遍历。目录一,图的遍历定义:二,深度优先搜索(DFS)连通图的深度优先遍历邻接矩阵法实现DFS邻接表法实现DFSD......
  • 【C++BFS算法】752 打开转盘锁
    本文涉及知识点C++BFS算法LeetCode752打开转盘锁你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字:‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’。每个拨轮可以自由旋转:例如把‘9’变为‘0’,‘0’变为‘9’。每次旋转都只能旋......
  • 广度(宽度)优先搜索(遍历)bfs详解
    简介    广度优先搜索(遍历)是一种在图的搜索遍历中较常见的算法。它的时间复杂度通常要比深度优先搜索(遍历)要低很多,尤其是最短路。这是因为深度优先的思想是走一条路要把它走到底再去考虑别的路,如果一开始走错了,后面会浪费很多时间在死胡同上,而且递归的方法本来就需要......
  • BFS:边权相同的最短路问题
    一、边权相同最短路问题简介二、迷宫中离入口最近的出口.-力扣(LeetCode)classSolution{public:constintdx[4]={1,-1,0,0};constintdy[4]={0,0,1,-1};intnearestExit(vector<vector<char>>&maze,vector<int>&e){intm=maze.size(),n=......
  • 01bfs
    针对一类特殊图求最短路,如果边权只有01则可以使用双端队列代替堆,将最短路的时间复杂度从\(O(nlogn)\)降为\(O(n)\)。原理:每次所走边边权为0则放队首,边权为1则放队尾。题目1#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definepiipair<int,int>#......