首页 > 其他分享 >BFS-走迷宫

BFS-走迷宫

时间:2023-12-22 15:25:17浏览次数:26  
标签:int 迷宫 BFS ++ && include

1. 题目

image-20231222141240853

简单概述:走迷宫问题,行走的方向是上下左右。这个迷宫内有些格子不能走,想要从迷宫的左上角走到右下角,最少移动次数。这道题属于最短路问题(求出到达一个点的最短路径)。


思路分析

为什么使用BFS求到的答案能保证是最短的路径?

因为BFS是逐层搜索的,能把当前层的所有可能值包括进来,每一层的值是上一层的值加一。


更新目标状态的内容是什么?

d[x][y] = d[t.first][t.second] + 1


如何标记当然位置已经走过?

首先,d数组全部被初始化为-1。当d中的值被修改为距离起点的长度时,表示这个位置已经被走过了。

BFS 模板

image-20231222150132526

代码实现

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

typedef pair<int, int> PII;

const int N = 110;

int n, m;
int g[N][N], d[N][N];
queue<PII> q;

int bfs() {
    
    memset(d, -1, sizeof d);
    
    d[0][0] = 0;
    q.push({0, 0});
    
    while (q.size()) {
        auto t = q.front();
        q.pop();
        
        int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
        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] != 1 && d[x][y] == -1) {
                d[x][y] = d[t.first][t.second] + 1;
                q.push({x, y});
            }
        }
    }
    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,++,&&,include
From: https://www.cnblogs.com/vLiion/p/17921652.html

相关文章

  • 图(树)的广度优先遍历bfs
    图的广度优先遍历广度优先遍历,就是在遍历时优先考虑遍历的广度,不像深度优先那样一条路径遍历到底,而是一层一层的遍历。由于广度优先是一层一层节点的遍历,在图的边权值都为1的情况下,若我们要求出节点a到节点b的最短路,就可以以a为源点(source)进行广搜,当a第一次搜到b时,其路径一......
  • BFS模板
    #classSolution:#defBFS(self,start,target):#q=[]#用一个列表做队列#v=[]#记录走过的路#q.append(start)#把起点放入队列#v.append(start)#加入走过的路#step=0#记录扩散步数#while......
  • 2023秋季专题训练四(BFS2)
    问题D:迷宫注意行列的坑点即可,可以多开一维来判断方向优先枚举转向少的,因为转向越少越可能达到点击查看代码intvis[110][110][5];//第三表示方向0向上1向右2向下3向左charst[110][110];//存图,注意坑点:行列反过来structnode{intx,y,kt,op;booloperator......
  • BFSAndDFS
    1.深度优先遍历(DFS)深度优先遍历算法步骤:1.访问初始结点v,并标记结点v为已访问。2.查找结点v的第一个邻接结点w。3.若w存在,则继续执行4,如果w不存在,则回到第1步,将从v的下一个结点继续。4.若w未被访问,对w进行深度优先遍历递归(即把w当做另一个v,然后进行步骤123)。5.查找结点v......
  • 洛谷P1443 马的遍历(BFS广度优先搜索)
    这道题只要求输入最小步数即可,而且数据的个数较大,所以优先采用BFS(广度优先搜索):广度优先搜索,即以数据搜索的广度优先,换句话说就是每一次操作都将所有可能的结果存储下来,随后对数据进行下一步处理,注意是对每组数据都只进行一次处理,如果是一条路走到头,这就变成了深度优先搜索(DFS)。而基......
  • 广度优先搜索(BFS)
    一、广搜介绍广度优先搜索是一种暴力算法,通过遍历一整张图来找寻结果。一般是使用队列来实现1.原理首先我们将根节点加入队列,然后遍历这个节点的全部方向,如果有满足条件的节点出现,就将其加入队列。在全部方向遍历完之后,我们将遍历的节点出队列。然后接着重复上述的操作,直到队......
  • AcWing 920. 最优乘车 (抽象建图 + bfs
    package算法提高课;importjava.util.Arrays;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Scanner;publicclassacw920{/***本题的建图方式:*我们对于每一个巴士路线进行观察,发现从前面的站走向这一条巴士路线......
  • #P1033. 迷宫问题
    题意是:给你一个迷宫,起点为S,终点为T,.表示空格,#表示障碍物无法通过,你每次可以从当前位置上下左右移动(不能出界或者撞到障碍物上)你需要找出从起点到终点的最少步数,如果不存在解,输出-1。BFS的练手题usingnamespacestd;intsx,sy,ex,ey;intn,m;intdx[4]={0,0,1,-1};intdy[4......
  • P1605 迷宫
    题目描述给定一个\(N\timesM\)方格的迷宫,迷宫里有\(T\)处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。输入格式第一行为三......
  • T399752 The Maze of the Imperial Sister(御姐的迷宫)题解
    LinkT399752TheMazeoftheImperialSister(御姐的迷宫)Question判断图内是否有环Solution先判断连通性,所有点是不是在一个块内,然后用树的性质,点数\(=\)边数\(+1\)判断Code#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5,maxe=maxn*2;structI......