HJ156 走迷宫

  • 题目
  • 题解(95)
  • 讨论(34)
  • 排行

简单 通过率:33.65% 时间限制:3秒 空间限制:256M

知识点广度优先搜索(BFS)

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

给定一个 n×mn×m 的网格。你从起点 (xs,ys)(xs​,ys​) 出发,每一次可以向上、下、左、右移动一步(若不超出边界)。某些格子上存在障碍物,无法经过。求从 (xs,ys)(xs​,ys​) 移动到终点 (xt,yt)(xt​,yt​) 的最少步数;若无法到达,输出 −1−1。

输入描述:

在一行上输入两个整数 n,m(1≦n,m≦1000)n,m(1≦n,m≦1000),代表网格的行数与列数。

在一行上输入四个整数 xs,ys,xt,yt(1≦xs,xt≦n; 1≦ys,yt≦m)xs​,ys​,xt​,yt​(1≦xs​,xt​≦n; 1≦ys​,yt​≦m),代表起点与终点的坐标。

此后 nn 行,第 ii 行输入一个长度为 mm 的字符串 gigi​,其中

∙ ∙若 gi,j="*"gi,j​="*",表示第 ii 行第 jj 列为障碍物;

∙ ∙若 gi,j="."gi,j​=".",表示该格子可通行。

保证起点所在格子可通行。

输出描述:

输出一个整数,表示最少移动次数;若无法到达,输出 −1−1。

示例1

输入:

复制代码
5 5
1 1 5 5
.....
****.
.....
**.**
.....

复制输出:

复制代码
12

复制

示例2

输入:

复制代码
5 5
1 1 4 5
.....
****.
.....
**.**
.....

复制输出:

复制代码
-1

复制

示例3

输入:

复制代码
5 5
1 1 5 5
.....
****.
.....
*****
.....

复制输出:

复制代码
-1
cpp 复制代码
#include<iostream>
#include<vector>
#include<queue>
#define INF 1e+7
using namespace std;
typedef struct node {
    int row;
    int col;
    node(int f, int t) :row(f), col(t) {}
}Node;
typedef struct direct {
    int crow;
    int ccol;
    direct(int f, int t) :crow(f), ccol (t) {}
}Direct;
vector<char> vec[1001];
int dp[1001][1001];
Direct dir[4] = { Direct {1,0},Direct{-1,0},Direct{0,1},Direct{0,-1} };
int main()
{
    char c;
    int xs, ys, n, m, xt, yt;
    queue<Node> qu;
    cin >> n >> m;
    cin >> xs >> ys >> xt >> yt;
    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= m; ++j)
            dp[i][j] = -1;
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> c;
            if (vec[i].empty())
                vec[i].push_back('0');
            vec[i].push_back(c);
        }
    }
    qu.push(Node{ xs,ys });
    while (!qu.empty()) {
        Node point = qu.front();
        qu.pop();
        for (int i = 0; i < 4; ++i) {
            int row = point.row + dir[i].crow;
            int col = point.col + dir[i].ccol;
            if (row >= 1 && row <= n && col >= 1 && col <= m && vec[row][col] == '.' && dp[row][col] == -1) {
                qu.push(Node{ row,col });
                dp[row][col] = dp[point.row][point.col] + 1;
            }
        }
    }
    if (dp[xt][yt] != -1)
        cout << ((xt == xs && yt == ys ) ? 0 : dp[xt][yt] + 1);
    else
        cout << -1;
}
相关推荐
June`13 分钟前
warp shuffle指令
c++·人工智能·算法·cuda
geovindu14 分钟前
go:Bit Operation Algorithm
开发语言·后端·算法·golang·位运算法
choumin40 分钟前
C程序能调用extern “C“声明的带默认参数的C++函数吗?
c语言·c++·extern c·默认参数
AmyLin_20011 小时前
PDF 色彩保真工程实践【3】上手实践:工程结构、依赖集成与一键构建运行
c++·visualstudio·pdf·zlib·vcpkg·libtiff·cmyk
并不喜欢吃鱼1 小时前
从零开始 C++------ 十六.深度拆解 C++ 智能指针:unique_ptr/shared_ptr/weak_ptr 底层模拟、内存泄漏根治
开发语言·c++
不相心 -w-1 小时前
Cmake的基础用法
linux·开发语言·c++
白白白小纯1 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
撑伞的鱼99372 小时前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor
手写码匠2 小时前
华为云Flexus+DeepSeek征文|Dify 构建企业级联网搜索 Agent:查询改写、多源检索与引用溯源实战
人工智能·深度学习·算法·aigc
七夜zippoe2 小时前
DolphinDB 能耗统计分析实战:报表生成、同比环比与定额对比
人工智能·算法·dolphindb·报表生成·能耗统计·定额对比