package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix char字符型二维数组
* @param word string字符串
* @return bool布尔型
*/
func hasPath(matrix [][]byte, word string) bool {
// write code here
n := len(matrix)
m := len(matrix[0])
if n == 0 || m == 0 {
return false
}
// flag 是否走过
flag := make([][]bool, n)
for i := range flag {
flag[i] = make([]bool, m)
}
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
// 每个位置都当作起点试一试
if dfs(matrix, n, m, i, j, word, 0, flag) {
return true
}
}
}
return false
}
// k 当前第几个字符
// 因为每一个点我们都可以往他的 4 个方向查找,所以我们可以把它想象为一棵 4 叉树,就是每个节点有 4 个子节点
func dfs(matrix [][]byte, n, m, i, j int, word string, k int, flag [][]bool) bool {
if i < 0 || i >= n || j < 0 || j >= m {
return false
}
if matrix[i][j] != word[k] {
return false
}
if flag[i][j] {
return false
}
if k == len(word)-1 {
return true
}
flag[i][j] = true
// up++
if dfs(matrix, n, m, i-1, j, word, k+1, flag) {
return true
}
// down++
if dfs(matrix, n, m, i+1, j, word, k+1, flag) {
return true
}
// l++
if dfs(matrix, n, m, i, j-1, word, k+1, flag) {
return true
}
// r++
if dfs(matrix, n, m, i, j+1, word, k+1, flag) {
return true
}
// 没找到经过此格的,修改回原来的样子
flag[i][j] = false
return false
}