题解 | #矩阵中的路径#

矩阵中的路径

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
}

全部评论

相关推荐

就是说这不对口的实习还有必要加么,不加就是纯纯三无
Java抽象小篮子:实习经历得好好包装一下,可以看看我发过的包装帖子
点赞 评论 收藏
分享
01-02 21:17
已编辑
西安理工大学 后端
程序员小白条:项目不太重要,你的优势的算法竞赛,然后多背相关的八股文,项目可以不作为重点考虑,面试可能就简单带过项目就行了,你可以直接写简历,背项目相关的八股文就行,也不用自己做,时间紧张的情况下,性价比最高
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务