描述:一天Extense在森林里探险的时候不当心走入了一个迷宫,迷宫能够当作是由n * n的格点组成,每一个格点只有2种状态, . 和#, 前者表示能够通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的状况下能不能办到。若是起点或者终点有一个不能通行(为#),则当作没法办到。java
输入:第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”。spa
输入数据:code
2 3 .## ..# #.. 0 0 2 2 5 ..... ###.# ..#.. ###.. ...#. 0 0 4 0
输出数据:递归
YES NO
/******************************************************************************/
class
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便可..
import