OJ水題-----迷宮

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

相關文章
相關標籤/搜索