有一个密室,有 m × n m\times n m×n个隔间,如下图所示,密室一共有 5 × 5 5\times5 5×5个隔间,用一个二维数组表示。
- 起点规定为(0,0);
- 1表示有这个隔间的钥匙,可以进入该隔间;
- 0表示没有这个隔间的钥匙,此路不通;
- 9表示宝藏所在隔间,即藏宝室。
左图中可以经过路径 (0,0)→(0,1)→(0,2)→(1,2)→(1,3)→(2,3) 开启藏宝室。
有图则不可以到达藏宝室。
给定一个二维数组,判断能否开启藏宝室,能则输出1,不能则输出0。
import java.util.*;
public class Main{
static int startX = 0;
static int startY = 0;
public static void main(String args[]) {
int[][] matrix = {{0,1,1,0,0},
{0,0,1,1,1},
{0,0,0,9,0},
{0,0,1,0,0},
{1,0,0,0,0}};
int row = matrix.length;
int column = matrix[0].length;
if(findPath(matrix, row, column))
System.out.println("1");
else
System.out.println("0");
}
public static boolean findPath(int[][] matrix, int row, int column) {
boolean[][] matrixHelp = new boolean[row][column];
matrix[startX][startY] = 1;
return findPathCore(matrix, matrixHelp, startX, startY, row, column);
}
public static boolean findPathCore(int[][] matrix, boolean[][] matrixHelp, int i, int j, int row, int column) {
if(i<0 || i>=row || j<0 || j>=column || matrixHelp[i][j]==true) //越界或者走过
return false;
if(matrix[i][j] == 0)//没有钥匙
return false;
matrixHelp[i][j] = true;
if(matrix[i][j] == 9||
findPathCore(matrix, matrixHelp, i-1, j, row, column)||
findPathCore(matrix, matrixHelp, i+1, j, row, column)||
findPathCore(matrix, matrixHelp, i, j-1, row, column)||
findPathCore(matrix, matrixHelp, i, j+1, row, column))
return true;
matrixHelp[i][j] = false;
return false;
}
}