单词搜索——回溯

84 阅读1分钟

image.png

代码

  1. b1用来维护当前位置是否已经使用过
  2. cur用来维护当前深度
  3. 4个if用来和不同方向的值比较
  4. 两个for循环来找到第一个值的位置
func exist(board [][]byte, word string) (b bool) {
    b1 := make([][]bool,len(board))
    for i := range b1 {
        b1[i] = make([]bool,len(board[0]))
    }
    cur := 0
    var et func(i,j int)
    et = func(i,j int) {
        if board[i][j] == word[len(word)-1] && cur == len(word)-1 {
            b = true
            return
        }
        if cur == len(word)-1 {
            return
        }
        if a :=i-1; a > -1 && board[a][j] == word[cur+1] && !b1[a][j] {
            cur++
            b1[a][j] = true
            et(a,j)
            cur--
            b1[a][j] = false
        }
        if a := j-1; a > -1 && board[i][a] == word[cur+1] && !b1[i][a] {
            cur++
            b1[i][a] = true
            et(i,a)
            cur--
            b1[i][a] = false
        }
        if a := j+1; a < len(board[0]) && board[i][a] == word[cur+1] && !b1[i][a] {
            cur++
            b1[i][a] = true
            et(i,a)
            cur--
            b1[i][a] = false
        }
        if a :=i+1; a < len(board) && board[a][j] == word[cur+1] && !b1[a][j] {
            cur++
            b1[a][j] = true
            et(a,j)
            cur--
            b1[a][j] = false
        }
        return
    }
    for i,v1 := range board {
        for j,v2 := range v1 {
            if v2 == word[0] {
                b1[i][j] = true
                et(i,j)
                b1[i][j] = false
            }
        }
    }
    return
}