package main /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix char字符型二维数组 * @param word string字符串 * @return bool布尔型 */ func hasPath( matrix [][]byte , word string ) bool { // write code here // boundary condition if len(matrix[0]) == 0 { return false } // visited 数组标记是否已经访问过 m, n := len(matrix), len(matrix[0]) visited := make([][]bool, m) for i := range visited { visited[i] = make([]bool, n) } // 题目规定上下左右四个方向都可以移动,四个一维数组分别向左、右、上、下移动 directions := [][]int{{-1,0}, {1, 0}, {0,1}, {0,-1}} // 回溯 var backtracking func(int, int, string) bool backtracking = func(i, j int, word string) bool { // trim tree 剪枝条件 if matrix[i][j] != word[0] || visited[i][j] { return false } // condition for end recursion 终止条件 if word = word[1:]; len(word) == 0 { return true } // access 访问该位置 visited[i][j] = true // 从该位置出发尝试向左、右、上、下四个方向寻找下一个要匹配的字符 for _, dir := range directions { x, y := i + dir[0], j + dir[1] // 不合法坐标判断 if x < 0 || x >= m || y < 0 || y >= n { continue } // 继续回溯,收集回溯结果,以便提前退出 if backtracking(x, y, word) { return true } } // 当前位置出发的所有可能性都遍历完了,将其标记为 false,继续向上回溯; // 回溯处理过程都可以转换为一颗树,本题是四叉树;一般都是二叉树。 visited[i][j] = false return false } // 所有可能性 for i := 0; i < m; i++ { for j := 0; j < n; j++ { if matrix[i][j] == word[0] { if backtracking(i, j, word) { // 找到一个合法结果就返回 return true } } } } return false }