1391. 检查网格中是否存在有效路径

67 阅读1分钟

题目:
leetcode.cn/problems/ch…

算法:
方法一、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
}