描述:一天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