题解 | #矩阵中的路径#

矩阵中的路径

https://www.nowcoder.com/practice/2a49359695a544b8939c77358d29b7e6

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param matrix char字符型二维数组
 * @param word string字符串
 * @return bool布尔型
 */
func hasPath(matrix [][]byte, word string) bool {
	// write code here
	var ans = false
  
	row := len(matrix)  // 矩阵的行数
	col := len(matrix[0]) // 列数
	end := len(word) - 1  // 搜索的字符数
  
    // 用来标记matrix[i][j] 是否已经走过
	visted := make([][]bool, row)
    for i := range visted {
        visted[i] = make([]bool, col)
    }
	
  	// 上下左右四个方向
	ways := [][]int{{-1, 0}, {0, 1}, {1, 0}, {0, -1}}
	
  	//判断是否越界 
    var overBoard  func(i, j int) bool 
	overBoard = func(i, j int) bool {
		return i < 0 || i >= row || j < 0 || j >= col
	}
	// 搜索
	var dfs func(i, j, k int)
	dfs = func(i, j, k int) {
	  	// 退出条件
		if k > end || ans {
			return
		}
		// 如果搜到最后一个了,再上一层已经判断了字符的相等
	  	// 所以 ans 可以直接置为 true
		if k == end {
			ans = true
            return
		}

		// 继续搜
		for _, w := range ways {
            // 前后左右四个方向
			ni := i + w[0]
			nj := j + w[1]
		   // 下一个坐标如果越界则跳过
			if overBoard(ni, nj) {
				continue
			}
		  	// 判断下一个坐标等不等于下一个字符
			if matrix[ni][nj] != word[k+1] {
				continue
			}
			if visted[ni][nj] {
				continue
			}
		  	
			visted[ni][nj] = true
		  	// 继续搜下一个
			dfs(ni, nj, k+1)
			visted[ni][nj] = false
		}

	}

	out: for i := 0; i < row; i++ {
		for j := 0; j < col; j++ {
		    // 如果已经搜索到了,直接跳出循环
            if ans {
                break out
            }
			if matrix[i][j] == word[0] {
				visted[i][j] = true
				dfs(i, j, 0)
				visted[i][j] = false
			}
		}
	}
	return ans
}

全部评论

相关推荐

09-08 17:17
同济大学 Java
狗不理fe:里面的人劝一句,别来虾,我们部门24校招生淘汰率30%,还有一些人说有一年保护期,不可能!!!
我的秋招日记
点赞 评论 收藏
分享
赛博小保安:你这简历没啥大问题的,经历技能也足够了,问题应该就是出在出身了,学院本就是这样,HR忙着跟92的勾搭呢,哪有心思看我们这些双非😿😭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务