lc1391. 检查网格中是否存在有效路径
给你一个 m x n 的网格 grid。网格里的每个单元都代表一条街道。grid[i][j] 的街道可以是:
1 表示连接左单元格和右单元格的街道。
2 表示连接上单元格和下单元格的街道。
3 表示连接左单元格和下单元格的街道。
4 表示连接右单元格和下单元格的街道。
5 表示连接左单元格和上单元格的街道。
6 表示连接右单元格和上单元格的街道。、
/**
* description:检查网格中是否存在有效路径
* author: sanmu
*/
public class Solution1391 {
private int width;
private int height;
private boolean[][] record;
public boolean hasValidPath(int[][] grid) {
height = grid.length;
width = grid[0].length;
record = new boolean[height][width];
record[0][0] = true;
return DFS(grid, 0, 0);
}
private boolean DFS(int[][] grid, int hor, int ver) {
if (hor == height - 1 && ver == width - 1) {
return true;
}
if (grid[hor][ver] == 1) {
if (ver - 1 >= 0 && !record[hor][ver - 1] && (grid[hor][ver - 1] == 4 || grid[hor][ver - 1] == 6 || grid[hor][ver - 1] == 1)) {
record[hor][ver - 1] = true;
boolean flag = DFS(grid, hor, ver - 1);
if (flag) {
return true;
}
record[hor][ver - 1] = false;
}
if (ver + 1 < width && !record[hor][ver + 1] && (grid[hor][ver + 1] == 3 || grid[hor][ver + 1] == 5 || grid[hor][ver + 1] == 1)) {
record[hor][ver + 1] = true;
boolean flag = DFS(grid, hor, ver + 1);
if (flag) {
return true;
}
record[hor][ver + 1] = false;
}
return false;
}
if (grid[hor][ver] == 2) {
if (hor - 1 >= 0 && !record[hor - 1][ver] && (grid[hor - 1][ver] == 3 || grid[hor - 1][ver] == 4 || grid[hor - 1][ver] == 2)) {
record[hor - 1][ver] = true;
boolean flag = DFS(grid, hor - 1, ver);
if (flag) {
return true;
}
record[hor - 1][ver] = false;
}
if (hor + 1 < height && !record[hor + 1][ver] && (grid[hor + 1][ver] == 5 || grid[hor + 1][ver] == 6 || grid[hor + 1][ver] == 2)) {
record[hor + 1][ver] = true;
boolean flag = DFS(grid, hor + 1, ver);
if (flag) {
return true;
}
record[hor + 1][ver] = false;
}
return false;
}
if (grid[hor][ver] == 3) {
if (ver - 1 >= 0 && !record[hor][ver - 1] && grid[hor][ver - 1] != 2 && grid[hor][ver - 1] != 5) {
record[hor][ver - 1] = true;
boolean flag = DFS(grid, hor, ver - 1);
if (flag) {
return true;
}
record[hor][ver - 1] = false;
}
if (hor + 1 < height && !record[hor + 1][ver] && (grid[hor + 1][ver] != 1 && grid[hor + 1][ver] != 4)) {
record[hor + 1][ver] = true;
boolean flag = DFS(grid, hor + 1, ver);
if (flag) {
return true;
}
record[hor + 1][ver] = false;
}
return false;
}
if (grid[hor][ver] == 4) {
if (ver + 1 < width && !record[hor][ver + 1] && grid[hor][ver + 1] != 2 && grid[hor][ver + 1] != 6) {
record[hor][ver + 1] = true;
boolean flag = DFS(grid, hor, ver + 1);
if (flag) {
return true;
}
record[hor][ver + 1] = false;
}
if (hor + 1 < height && !record[hor + 1][ver] && (grid[hor + 1][ver] != 1 && grid[hor + 1][ver] != 3)) {
record[hor + 1][ver] = true;
boolean flag = DFS(grid, hor + 1, ver);
if (flag) {
return true;
}
record[hor + 1][ver] = false;
}
return false;
}
if (grid[hor][ver] == 5) {
if (ver - 1 >= 0 && !record[hor][ver - 1] && grid[hor][ver - 1] != 2 && grid[hor][ver - 1] != 3) {
record[hor][ver - 1] = true;
boolean flag = DFS(grid, hor, ver - 1);
if (flag) {
return true;
}
record[hor][ver - 1] = false;
}
if (hor - 1 >= 0 && !record[hor - 1][ver] && (grid[hor - 1][ver] != 1 && grid[hor - 1][ver] != 6)) {
record[hor - 1][ver] = true;
boolean flag = DFS(grid, hor - 1, ver);
if (flag) {
return true;
}
record[hor - 1][ver] = false;
}
return false;
}
if (grid[hor][ver] == 6) {
if (hor - 1 >= 0 && !record[hor - 1][ver] && grid[hor - 1][ver] != 1 && grid[hor - 1][ver] != 5) {
record[hor - 1][ver] = true;
boolean flag = DFS(grid, hor - 1, ver);
if (flag) {
return true;
}
record[hor - 1][ver] = false;
}
if (ver + 1 < width && !record[hor][ver + 1] && (grid[hor][ver + 1] != 4 && grid[hor][ver + 1] != 2)) {
record[hor][ver + 1] = true;
boolean flag = DFS(grid, hor, ver + 1);
if (flag) {
return true;
}
record[hor][ver + 1] = false;
}
return false;
}
return false;
}
}
AC截图