2
public boolean hasValidPath(int[][] grid) {3
int m = grid.length, n = grid[0].length;4
int[][] visited = new int[m][n];5
return dfs(grid, 0, 0, m, n, visited);8
public boolean dfs(int[][] grid, int i, int j, int m, int n, int[][] visited) {9
if (i == m - 1 && j == n - 1) return true;10
if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] == 1) return false;12
if (grid[i][j] == 1) {14
&& (grid[i][j - 1] == 1 || grid[i][j - 1] == 4 || grid[i][j - 1] == 6)15
&& dfs(grid, i, j - 1, m, n, visited))17
&& (grid[i][j + 1] == 1 || grid[i][j + 1] == 3 || grid[i][j + 1] == 5)18
&& dfs(grid, i, j + 1, m, n, visited))) return true;19
} else if (grid[i][j] == 2) {21
&& (grid[i + 1][j] == 2 || grid[i + 1][j] == 5 || grid[i + 1][j] == 6)22
&& dfs(grid, i + 1, j, m, n, visited))24
&& (grid[i - 1][j] == 2 || grid[i - 1][j] == 3 || grid[i - 1][j] == 4)25
&& dfs(grid, i - 1, j, m, n, visited))) return true;26
} else if (grid[i][j] == 3) {28
&& (grid[i][j - 1] == 1 || grid[i][j - 1] == 4 || grid[i][j - 1] == 6)29
&& dfs(grid, i, j - 1, m, n, visited))31
&& (grid[i + 1][j] == 2 || grid[i + 1][j] == 5 || grid[i + 1][j] == 6)32
&& dfs(grid, i + 1, j, m, n, visited))) return true;33
} else if (grid[i][j] == 4) {34
if (((i < m - 1 && (grid[i + 1][j] == 2 || grid[i + 1][j] == 5 || grid[i + 1][j] == 6))35
&& dfs(grid, i + 1, j, m, n, visited))37
&& (grid[i][j + 1] == 1 || grid[i][j + 1] == 3 || grid[i][j + 1] == 5)38
&& dfs(grid, i, j + 1, m, n, visited))) return true;39
} else if (grid[i][j] == 5) {41
&& (grid[i][j - 1] == 1 || grid[i][j - 1] == 4 || grid[i][j - 1] == 6)42
&& dfs(grid, i, j - 1, m, n, visited))44
&& (grid[i - 1][j] == 2 || grid[i - 1][j] == 3 || grid[i - 1][j] == 4)45
&& dfs(grid, i - 1, j, m, n, visited))) return true;48
&& (grid[i - 1][j] == 2 || grid[i - 1][j] == 3 || grid[i - 1][j] == 4)49
&& dfs(grid, i - 1, j, m, n, visited))51
&& (grid[i][j + 1] == 1 || grid[i][j + 1] == 3 || grid[i][j + 1] == 5)52
&& dfs(grid, i, j + 1, m, n, visited))) return true;