探险森林宝藏的编程问题可以通过广度优先搜索(BFS)或深度优先搜索(DFS)来解决。这里提供一个基于BFS的解决方案,假设森林是一个二维网格,宝藏的坐标是事先给定的。
输入格式
输入包含N行,每行包含一个字符串,表示森林的布局。'X'表示障碍,'T'表示宝藏,'E'表示边缘点。
输出格式
输出一个整数,表示到达宝藏所需的最少步数。
代码实现
```cpp
include include include using namespace std; int n, m; vector vector void bfs() { queue bool visited[n][m]; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { visited[i][j] = false; } } // 将宝藏点加入队列,距离设为0 for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (forest[i][j] == 'T') { q.push({i, j}); distance[i][j] = 0; visited[i][j] = true; break; } } } // 定义四个方向 vector while (!q.empty()) { auto [x, y] = q.front(); q.pop(); for (auto [dx, dy] : directions) { int nx = x + dx; int ny = y + dy; if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && forest[nx][ny] != 'X') { if (forest[nx][ny] == 'E') { return distance[x][y] + 1; } if (forest[nx][ny] == 'T') { return distance[x][y] + 2; } q.push({nx, ny}); visited[nx][ny] = true; distance[nx][ny] = distance[x][y] + 1; } } } return -1; // 如果没有找到宝藏,返回-1 } int main() { while (cin >> n >> m) { getchar(); // 读取换行符 forest.assign(n, vector distance.assign(n, vector for (int i = 0; i < n; ++i) { cin >> forest[i]; } int result = bfs(); cout << result << endl; } return 0; } ``` 解释 读取森林的布局和大小。 初始化一个队列用于BFS,以及一个二维数组`visited`用于记录访问状态。 将宝藏点加入队列,并设置其距离为0。 定义四个方向进行移动。 从队列中取出当前点,检查其四个方向的相邻点。 如果遇到边缘点,返回当前距离加1。 如果遇到宝藏点,返回当前距离加2(因为可以直接到达宝藏)。 如果遇到未访问的障碍,将其加入队列并标记为已访问。 读取输入并初始化森林和距离数组。 调用BFS函数并输出结果。 这个算法的时间复杂度是O(N*M),其中N和M分别是森林的行数和列数。初始化
BFS过程
主函数