矩阵中的路径

在这里插入图片描述
这题是非常明显的DFS,但小陷阱非常多,改了很多次才通过。

  • 首先给出的函数输入是一个一维数组,我非常不善于在一维数组识别行列,所以先把数组转换成了二维,也方便dfs时识别边界。
  • 判断是否用过的visited也可以用别的方式,可以放在全局变量不用随参数每次遍历,需要用到输入参数可以在全局中声明,在函数中复制即可。
  • 我开始想的是先遍历一遍数组找到开头,但是如题目中e开头就有很多种,这样就不合适了,且按原方法判断过的开头会把visited都改变了影响后面判断,所以一定是DFS**回溯!**对每个点判断且需要把判断过的还原。
  • DFS过程中首先必须判断边界!index会越界一定要最先判断在这里卡了好久,然后是成立条件,标答中有dfs模板值得参考。
dfs(){
 
    // 第一步,检查下标是否满足条件
 
    // 第二步:检查是否被访问过,或者是否满足当前匹配条件
 
    // 第三步:检查是否满足返回结果条件
 
    // 第四步:都没有返回,说明应该进行下一步递归
    // 标记
    dfs(下一次)
    // 回溯
} 
 
 
main() {
    for (对所有可能情况) {
        dfs()
    }
}

public class Solution {
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
    {
        boolean[][] visited = new boolean[rows][cols];
        char[][] m = new char[rows][cols];
         for (int i = 0; i < rows ; i++) {
         	for(int j = 0; j < cols; j++) {
             	m[i][j] = matrix[i*cols + j];
         	}
     	}
        for(int i = 0; i < rows; i++)
            for(int j = 0; j < cols; j++)
                if(helper(m, i, j, str, 0, visited)) return true;
        return false;
    }
    public boolean helper(char[][] m, int r, int c, char[] str, int index, boolean[][] visited){
        if(index >= str.length) return true;
        if(r < 0 || c < 0 || r >= m.length || c >= m[0].length || m[r][c] != str[index] || visited[r][c] == true) return false;
        
        visited[r][c] = true;
        boolean ans =  helper(m, r-1, c, str, index+1, visited) 
            || helper(m, r, c-1, str, index+1, visited) 
            || helper(m, r+1, c, str, index+1, visited) 
            || helper(m, r, c+1, str, index+1, visited);
        visited[r][c] = false;
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值