算法:
方法一、dfs
func hasValidPath(grid [][]int) bool {
m, n := len(grid), len(grid[0])
visited := make([][]bool, m)
for i := range visited {
visited[i] = make([]bool, n)
}
dx := []int{1,0,-1,-1}
dy := []int{0,1,0,0}
// pipe[l][k] = val 从k方向进入到l号拼图,val表示进入的方向,val=-1表示无法进入
pipe := [][]int{
{-1,-1,-1,-1},
{-1,1,-1,3},
{0,-1,2,-1},
{-1,0,3,-1},
{-1,-1,1,0},
{3,2,-1,-1},
{1,-1,-1,2},
}
var dfs func(i, j, dir int) bool
dfs = func(i, j, dir int) bool {
visited[i][j] = true
if i == m - 1 && j == n - 1 {
return true
}
xx := i + dx[dir]
yy := j + dy[dir]
if xx < 0 || xx >= m || yy < 0 || yy >= n {
return false
}
next := grid[xx][yy]
if pipe[next][dir] != -1 && !visited[xx][yy] {
return dfs(xx, yy, pipe[next][dir])
}
return false
}
start := grid[0][0]
for i := 0; i < 4; i ++ {
if pipe[start][i] != -1 {
if dfs(0, 0, pipe[start][i]) {
return true
}
}
}
return false
}