描述:一天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
/******************************************************************************/
import java.util.Scanner;
public class Main {
static int n = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
for (int i = 0; i < number; i++) {
n = sc.nextInt();
char[][] str = new char[n][n];
// 赋值
for (int j = 0; j < n; j++) {
String temp = sc.next();
for (int a = 0; a < n; a++) {
str[j][a] = temp.charAt(a);
}
}
int ha = sc.nextInt();
int la = sc.nextInt();
int hb = sc.nextInt();
int lb = sc.nextInt();
if (is(str, ha, la, hb, lb)) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
static boolean is(char[][] str, int ha, int la, int hb, int lb) {
if (ha >= n || la >= n || ha < 0 || la < 0) {
return false;
}
if (str[ha][la] == '#' || str[hb][lb] == '#') {
return false;
}
if (ha == hb && la == lb) {
return true;
}
if (str[ha][la] == '#') {
return false;
}
str[ha][la] = '#';
return is(str, ha++, la, hb, lb) || is(str, ha--, la, hb, lb) || is(str, ha, la++, hb, lb) || is(str, ha--, la, hb, lb);
}
}
实际就是一个递归..每次将坐标上下左右各移动一下判断是否能到达hb,lb即可..