ybt1215 迷宫
【题目描述】
一天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”。
【输入样例】
2 3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0
【输出样例】
YES
NO
【题解】
这道题的思路是从起点开始分别向四个方向深搜,到最后就可以搜到所有能联通的点。只要搜到的点是终点,那么就输出“YES”,否则,将所有能到达的点都搜过一遍还是没有找到,输出“NO”。
#include<iostream>
#include<cstring>
using namespace std;
int xr[4] = { 0,1,0,-1 };
int yr[4] = { -1,0,1,0 };//操作记录
int x_1, x_2, y_1, y_2, T, n;
char a;
bool vsd[100][100], flag;
void dfs(int x, int y) {//深搜
if (flag) {
return;
}
if ((x < 0) || (y < 0)) {
return;
}
if ((x >= n) || (y >= n)) {
return;
}
if (vsd[x][y]) {
return;
}
vsd[x][y] = 1;
if ((x == x_2) && (y == y_2)) {
cout << "YES" << endl;
flag = true;//打标记
return;
}
for (int i = 0; i < 4; i++) {
dfs(x + xr[i], y + yr[i]);
}
return;
}
int main() {
cin >> T;
for (int o = 1; o <= T; o++) {//多组数据
memset(vsd, false, sizeof(vsd));//清空数组
flag = false;//初始化flag
cin >> n;//输入矩阵大小
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a;
if (a == '#') {
vsd[i][j] = 1;//禁止通行可以用已访问到等效代替
}
}
}
cin >> x_1 >> y_1 >> x_2 >> y_2;
if (vsd[x_1][y_1] || vsd[x_2][y_2]) {//特判起点或终点是“#”的时候
cout << "NO" << endl;
continue;
}
else {//从x_1,y_1的位置开始搜
dfs(x_1, y_1);
}
if (!flag) {//到最后也没有连通
cout << "NO" << endl;
}
}
return 0;
}