以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
要解决这个问题,我们可以采用广度优先搜索(BFS)算法,因为BFS能够保证找到最短路径。以下是C++程序的大致框架和关键点:
#include <iostream>
#include <vector>
#include <queue>
#include <utility> // for std::pair
#include <fstream>
using namespace std;
const int MAXN = 2000;
const int dx[4] = {-1, 1, 0, 0};
const int dy[4] = {0, 0, -1, 1};
// 地图数据
char map[MAXN][MAXN];
bool visited[MAXN][MAXN];
// 用于BFS的队列,存储<行,列,步数>
queue<pair<int, int>> q;
// 检查坐标是否有效
bool isValid(int x, int y, int n, int m) {
return x >= 0 && x < n && y >= 0 && y < m;
}
// BFS算法
int bfs(int n, int m, int start_x, int start_y, int end_x, int end_y) {
q.push({start_x, start_y, 0});
visited[start_x][start_y] = true;
while (!q.empty()) {
auto [x, y, steps] = q.front();
q.pop();
if (x == end_x && y == end_y) {
return steps; // 到达终点
}
for (int i = 0; i < 4; ++i) {
int new_x = x + dx[i];
int new_y = y + dy[i];
if (isValid(new_x, new_y, n, m) && map[new_x][new_y] == '.' && !visited[new_x][new_y]) {
visited[new_x][new_y] = true;
q.push({new_x, new_y, steps + 1});
}
}
}
return -1; // 如果没有找到路径
}
int main() {
ifstream fin("libyan.in");
ofstream fout("libyan.out");
if (!fin.is_open() || !fout.is_open()) {
cerr << "File opening error!" << endl;
return -1;
}
int n, m;
fin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
fin >> map[i][j];
}
}
int result = bfs(n, m, 0, 0, n - 1, m - 1);
fout << result;
fin.close();
fout.close();
return 0;
}
这段代码提供了一个基本的框架,包括:
- 定义了地图大小和障碍物的检测。
- 实现了BFS算法来找到最短路径。
- 使用了队列来存储待处理的节点和它们的步数。
- 检查了每个节点的四个方向,并确保它们是可访问的且未被访问过。
请注意,这段代码没有进行错误检查,比如输入文件是否正确,或者输出文件是否成功写入。在实际应用中,你可能需要添加更多的错误处理逻辑。此外,这段代码假设输入文件的格式是正确的,并且地图的起点和终点都是可到达的。