一、题目重述
给定n×m的二维矩阵表示探险地图,每个格子可能是:
平地('.')
障碍物('#')
起点('S')
终点('E') 求从起点到终点的最短路径步数,无法到达则输出-1。
二、核心算法:BFS广度优先搜索
选择原因:BFS是解决无权图最短路径问题的最优方案,时间复杂度O(nm)完全适合题目约束条件(典型n,m≤1000)
三、解题步骤拆解
输入处理:读取矩阵尺寸和地图数据
定位起止点:扫描矩阵记录S和E的坐标
BFS初始化:
方向数组dir[4][2]表示上下左右移动
距离矩阵dist记录步数(初始化为-1)
队列q存入起点坐标
BFS执行: while(!q.empty()){ auto [x,y] = q.front(); q.pop(); for(方向遍历){ int nx = x+dx, ny = y+dy; if(越界检查 || 障碍物检查 || 已访问检查) continue; dist[nx][ny] = dist[x][y]+1; if(到达终点) return 结果; q.push({nx,ny}); } }
结果输出:根据dist矩阵输出终点值
四、完整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; }
原文:洛谷P11228地图探险题解(CSP-J 2024真题)
點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評論
評論
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦