洛谷P11228地图探险题解(CSP-J 2024真题)

贾蔷
• 阅读 20

洛谷P11228地图探险题解(CSP-J 2024真题) 一、题目重述 给定n×m的二维矩阵表示探险地图,每个格子可能是: 平地('.') 障碍物('#') 起点('S') 终点('E') 求从起点到终点的最短路径步数,无法到达则输出-1。 二、核心算法:BFS广度优先搜索 选择原因:BFS是解决无权图最短路径问题的最优方案,时间复杂度O(nm)完全适合题目约束条件(典型n,m≤1000)

二、完整C++实现(带详细注释)

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;
char grid[N][N];
int dist[N][N]; // 距离矩阵
int n, m;
int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1}; // 方向数组

int bfs(int sx, int sy, int ex, int ey) {
    memset(dist, -1, sizeof dist);
    queue<pair<int,int>> q;
    q.push({sx, sy});
    dist[sx][sy] = 0;

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

        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            // 越界检查 || 障碍物检查 || 已访问检查
            if (nx < 0 || nx >= n || ny < 0 || ny >= m 
                || grid[nx][ny] == '#' || dist[nx][ny] != -1) 
                continue;

            dist[nx][ny] = dist[x][y] + 1;
            if (nx == ex && ny == ey) return dist[nx][ny];
            q.push({nx, ny});
        }
    }
    return -1;
}

int main() {
    cin >> n >> m;
    int sx, sy, ex, ey;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) {
            cin >> grid[i][j];
            if (grid[i][j] == 'S') sx = i, sy = j;
            if (grid[i][j] == 'E') ex = i, ey = j;
        }

    cout << bfs(sx, sy, ex, ey);
    return 0;
}

四、算法优化点 双向BFS:当起点和终点都已知时,可减少50%搜索范围 A*算法:若有启发式信息可用(如坐标距离) 输入优化:使用快速IO方法处理大规模数据

原文:洛谷P11228地图探险题解(CSP-J 2024真题)

点赞
收藏
评论区
推荐文章
九路 九路
4年前
前端学数据结构与算法:二叉树的四种遍历方式及其应用
前言上一章我们从0到1的实现了一颗二叉搜索树,以及理解了二叉搜索树的特性与基本操作,这一章介绍关于二叉树的更多操作,也就是树的遍历,对树的每个节点进行访问。主要包括前序遍历、中序遍历、后序遍历、层序遍历,前面三种也叫深度优先遍历(DFS),最后的层序遍历也叫广度优先遍历(BFS),理解这四种遍历方式的不同,再遇到树相关的算法问题时,也就能更加游刃有余。这
Stella981 Stella981
3年前
Codeforces 1005F Berland and the Shortest Paths 【最短路树】【性质】
其实是一道裸题,如果没学过最短路树的话会比较难做,要想很久想到关键性质才能做出来。最短路树顾名思义,就是从一个图中生成出来一棵树,使得每个顶点到root的距离是单源最短路。如果有这样的树的话,那可见这样的树是符合题意的。怎么生成这样的树呢?关键在于记录前驱father,一个距离root最短路是6的点必定从一个距离root最短路是5的点到达(这两个点之
Stella981 Stella981
3年前
Bellman
一、BellmanFordBellmanFord算法是一种用于计算带权有向图中单源最短路径(当然也可以是无向图)。与Dijkstra相比的优点是,也适合存在负权的图。若存在最短路(不含负环时),可用BellmanFord求出,若最短路不存在时,BellmanFord只能用来判断是否存在负环。松弛:    每次松弛操作
Stella981 Stella981
3年前
HDU 3416 Marriage Match IV (Dijkstra+最大流)
题意:N个点M条边的有向图,给定起点S和终点T,求每条边都不重复的ST的最短路有多少条。分析:首先第一步需要找出所有可能最短路上的边。怎么高效地求出呢?可以这样:先对起点S,跑出最短路;对于每条边e(u,v,w),若d\u\wd\v\。那么e就是最短路上的一条边。在前向星存储的图中遍历即可。网上还有题解用的方法是分别从S和T跑两
Stella981 Stella981
3年前
FZU2150 Fire Game
题目:_两个熊孩子在n\m的平地上放火玩,表示草,两个熊孩子分别选一个格子点火,火可以向上向下向左向右在有草的格子蔓延,点火的地方时间为0,蔓延至下一格的时间依次加一。求烧完所有的草需要的最少时间。如不能烧完输出1。_输入:_第一行,输入一个T,表示有T组测试数据。每组数据由一个n,m分别表示行列_1
Wesley13 Wesley13
3年前
C语言递归之二叉树的最小深度
https://www.cnblogs.com/shichampion/p/12262678.html题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例输入:3,9,20,null,null,15,7
Stella981 Stella981
3年前
Leet Code 74 Search a 2D Matrix
写一个高效的算法,在m×n的二维矩阵中搜索一个值。矩阵有以下性质:每一行从左到右为升序。每一行的第一个数都比上一行最后一个数大。例如,有以下矩阵:\  \1,  3, 5, 7\,  \10,11,16,20\,  \23,30,34,50\\给定target3,返
Stella981 Stella981
3年前
AStar寻路1
A星算法是一种启发式的搜索方法,通过一个路径评估函数,来动态确定最佳路径。这点和广度搜索不同。基本思想是有2个列表,open和close,open列表里面的节点表示待搜索周围点的节点,close列表里面记录着不需要搜索的节点。启发式函数fgh;f表示该路径的代价,g表示起点到搜索的点的该条路径的实际值,h表示该搜索的点到终点的估计值。h的
贾蔷 贾蔷
1星期前
力扣746:三步通关最小花费爬楼梯
题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值costi,之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点。要求找出到达顶部的‌最小花费路径‌。例如输入cost
贾蔷 贾蔷
1星期前
NOIP 2000 提高组 洛谷1004题(方格取数)解题思路与C++代码解析
一、题目描述简要描述题目:例如,在一个n×n的方格图中,每个格子包含一个正整数。需要选择两条从左上角到右下角的路径,路径可重复经过格子,但两条路径除起点和终点外不能相交。求两条路径数字和的最大值。二、解题思路与算法分析1.问题分析1.问题核心是求解两条不交