Javascript剑指offer65题:矩阵中的路径

Javascript剑指offer65题:矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

思路

1: 我觉得全部都用二维数组做会比较方便 因为要有(row+1,col)之类的操作,所以要把matrix转化为二维数组

遍历数组 把数组push到新的空数组中即可

    matrixArray = matrix.split('')
    var matrixTwoArray = []
    for(var i = 0;i<rows*cols;i = i+cols){
        var temp = matrixArray.slice(i,i+cols)
        matrixTwoArray.push(temp)
    }
    return matrixTwoArray
2: 要建立一个visited数组 存放是否已经被访问过

visited[i] = []是关键

    var visited = []
    for(var i = 0;i<rows;i++){
        visited[i] = []
        for(var j = 0;j<cols;j++){
            visited[i][j] = false
        }
    }
3: 对二维数组中的每一个元素都执行一个check函数。判断函数的执行结果,如果为ture 整个就return true 说明以这个函数为起点的路径是ok的
    for(var i = 0;i<rows;i++){
        for(var j = 0;j<cols;j++){
            if(check(i,j,pathIndex)){
                return true
            }
        }
    }
4: 具体的check函数

首先定义一个pathExit变量 一开始就设置为false 当自己这个点满足要求的时候,去检验兄弟节点是不是满足要求 如果满足的话pathExit的值为true
当自己满足要求的时候,pathIndex++且当前节点设置为已访问 pathIndex++的目的是判断兄弟节点是否有值满足下一个值
当兄弟节点没有值满足的时候pathExit设置为false 且pathIndex-- 当前节点设置未访问
当兄弟节点有值满足的时候pathExit设置为ture
return pathExit

function check(row,col,pathIndex){
        var pathExit = false
        // pathExit设置为false 在前边设置为false 后边的话如果进入第一个if循环 则有翻身的可能 可能就是测试这个节点的兄弟节点 
        // pathExit = ( || || || || ) 有一个为true就可以继续执行下去
        // 因为函数是递归 所以返回的不是最终结果 而是一小轮的结果 所以要return 一个变量 而不是return false
        if(pathIndex === path.length){
            return true
        }
        if(row>=0 && row<rows && col>=0 && col<cols && path[pathIndex] === matrixTwoArray[row][col] && visited[row][col]==false){
            // 自己 通过了考验 要考验兄弟姐妹了 所以要indexPath++
            pathIndex++
            visited[row][col] = true
            pathExit = check(row-1,col,pathIndex) || check(row+1,col,pathIndex) || check(row,col+1,pathIndex) || check(row,col-1,pathIndex)
            if(!pathExit){
                pathIndex--
                visited[row][col] = false
            }
        }
        // 这个地方不能是returnfalse 而一定要是return testBrothers
        return pathExit
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值