用c++编程描述 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。 输入 第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n (1 <= n <= 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha, la, hb, lb全部是从0开始计数的。 输出 k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
时间: 2024-02-21 15:00:48 浏览: 219
以下是C++代码实现:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dx[4] = {0, 0, 1, -1}; // 方向数组
int dy[4] = {1, -1, 0, 0};
bool bfs(vector<vector<char>>& maze, int ha, int la, int hb, int lb) {
int n = maze.size();
vector<vector<bool>> visited(n, vector<bool>(n, false));
queue<pair<int, int>> q; // 存储坐标的队列
q.push(make_pair(ha, la));
visited[ha][la] = true;
while (!q.empty()) {
auto cur = q.front();
q.pop();
if (cur.first == hb && cur.second == lb) {
return true; // 找到终点
}
for (int i = 0; i < 4; i++) {
int nx = cur.first + dx[i];
int ny = cur.second + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < n && maze[nx][ny] == '.' && !visited[nx][ny]) {
q.push(make_pair(nx, ny));
visited[nx][ny] = true;
}
}
}
return false; // 遍历完所有可行路径,未找到终点
}
int main() {
int k;
cin >> k;
while (k--) {
int n;
cin >> n;
vector<vector<char>> maze(n, vector<char>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> maze[i][j];
}
}
int ha, la, hb, lb;
cin >> ha >> la >> hb >> lb;
if (maze[ha][la] == '#' || maze[hb][lb] == '#') {
cout << "NO" << endl;
continue;
}
if (bfs(maze, ha, la, hb, lb)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
```
解释:
1. 输入数据的组数k,表示有k组测试数据,使用while循环遍历每一组数据。
2. 对于每组数据,首先输入迷宫的规模n,然后输入n * n的矩阵表示迷宫,再输入起点A和终点B的坐标。
3. 如果起点或终点为#,则无法到达,输出NO。
4. 使用BFS遍历迷宫,从起点开始搜索,尝试向四个方向移动,如果移动到的点合法且未被访问过,则将其加入队列中,标记为已访问。重复该过程,直到找到终点或遍历完所有可行路径。
5. 如果找到终点,则输出YES,否则输出NO。
注意:在输入坐标时,题目中指定从0开始计数,需要注意数组下标的对应关系。
阅读全文