首页 > 试题广场 >

矩阵中的路径

[编程题]矩阵中的路径
  • 热度指数:82133 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
数据范围:,
示例1

输入

[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"

输出

true
示例2

输入

[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcb"

输出

false
function hasPath( matrix ,  word ) {
    let m = matrix.length,n = matrix[0].length;
    function dfs(i,j,k=0){ // 第k个字符
        if(i<0 || i>=m || j<0 || j>=n||word[k]!==matrix[i][j] || matrix[i][j]===0) return false;
        if(k === word.length-1) return true;
        let temp = matrix[i][j];
        matrix[i][j] = 0;
        if(dfs(i,j+1,k+1) || dfs(i,j-1,k+1) || dfs(i-1,j,k+1) || dfs(i+1,j,k+1)){
            return true;
        } 
        matrix[i][j] = temp;
        return false;
    }
    for(let i=0;i<m;i++){
        for(let j=0;j<n;j++){
            if(dfs(i,j,0)){
                return true;
            }
        }
    }
    return false;
}

发表于 2022-08-27 22:19:04 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param matrix char字符型二维数组 
 * @param word string字符串 
 * @return bool布尔型
 */
function hasPath( matrix , word ) {
    // write code here
    let rows = matrix.length;
    let cols = matrix[0].length;
    let flag = new Array((rows-1)*(cols-1)).fill(null);
    for(let i=0;i<rows;i++){
        for(let j=0;j<cols;j++){
            //循环遍历二维数组,找到七点啊等于word第一个元素的值,再递归判断四周是否有符合条件的第二个值
            if(judge(matrix,i,j,rows,cols,flag,word,0)){
                return true;
            }
        }
    }
    return false;
}
function judge(matrix,i,j,rows,cols,flag,word,k){
    //根据i和j计算匹配的第一个元素转为一维数组的未知
    let index=i*cols+j;
    //递归终止条件
    if(i<0||j<0||i>=rows||j>=cols||matrix[i][j]!=word[k]||flag[index]==true){
        return false;
    }
    //k的初始值为0,若k已经到达word末尾了,说明都已经匹配成功了,直接返回true
    if(k==word.length-1){
        return true
    }
    //要走的第一个位置为true,表示已经走过了
    flag[index]=true;
    //回溯,递归寻找 每次找到给k加1,找不到就还原
    if(judge(matrix,i-1,j,rows,cols,flag,word,k+1)||
       judge(matrix,i+1,j,rows,cols,flag,word,k+1)||
       judge(matrix,i,j-1,rows,cols,flag,word,k+1)||
       judge(matrix,i,j+1,rows,cols,flag,word,k+1)){
        return true
    }
    //走到这,说明这一条路不通,还原尝试其他路径
    flag[index]=false;
    return false;
}
module.exports = {
    hasPath : hasPath
};

发表于 2021-08-31 11:00:37 回复(0)

问题信息

dfs
上传者:牛客301499号
难度:
2条回答 3147浏览

热门推荐

通过挑战的用户

查看代码