
代码
- b1用来维护当前位置是否已经使用过
- cur用来维护当前深度
- 4个if用来和不同方向的值比较
- 两个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
}