用c++按上面的要求编写一个代码
时间: 2024-10-08 07:26:30 浏览: 28
在C++中,你可以使用广度优先搜索(Breadth First Search, BFS)来解决这个问题,因为它最适合寻找两点之间的最短路径。下面是一个简单的BFS算法实现:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INF = 1e9; // 用于标记无解
int bfs(vector<vector<char>>& maze, int m, int n, pair<int, int> start, pair<int, int> end) {
vector<vector<bool>> visited(m, vector<bool>(n, false));
queue<pair<int, int>> q;
q.push(start);
visited[start.first][start.second] = true;
while (!q.empty()) {
int row = q.front().first, col = q.front().second;
q.pop();
if (row == end.first && col == end.second)
return visited[row][col] ? 0 : -1; // 找到目标,返回步数,未达则返回-1
for (int dr = [-1, 0, 1, 0]; dr[0] != 0 || dr[1] != 0; ++dr[0], ++dr[1]) {
int newRow = row + dr[0];
int newCol = col + dr[1];
// 只有在有效范围内,且不是墙壁和已访问的位置才继续探索
if (newRow >= 0 && newRow < m && newCol >= 0 && newCol < n &&
maze[newRow][newCol] != '#' && !visited[newRow][newCol]) {
visited[newRow][newCol] = true;
q.push({newRow, newCol});
}
}
}
return -1; // 未找到路径
}
int main() {
int m, n;
cin >> m >> n;
vector<vector<char>> maze(m, vector<char>(n));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> maze[i][j];
if (maze[i][j] == 'S')
maze[i][j] = 0;
else if (maze[i][j] == 'T')
maze[i][j] = 2;
}
}
pair<int, int> start, end;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (maze[i][j] == 0)
start = {i, j};
else if (maze[i][j] == 2)
end = {i, j};
}
}
int result = bfs(maze, m, n, start, end);
cout << "从起点到终点的最小步数: " << result << endl;
return 0;
}
```
这个程序首先读取迷宫矩阵,然后将起点转换为数字标识,方便后续操作。接着使用BFS遍历迷宫,找到从起点到终点的最短路径。注意这里把起点和终点视为数字,因为BFS更适合在这种形式下进行。最后输出结果。如果找不到路径,则返回-1。
阅读全文