ybt1215 迷宫

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;
}
posted @ 2020-02-15 13:22  Wild_Donkey  阅读(287)  评论(0编辑  收藏  举报