图片说明

很久不做这种深度优先遍历和广度优先遍历的题目,有点眼生。后面几道题目应该都是和深度优先遍历和广度优先遍历有关的题目,这种题目就不能再依靠高级数据结构的思想来帮助我们解决问题,要纯靠自己的思维能力来进行解决了。

这道题目自己的思维局限是没有理解广度优先遍历要掌握的诀窍导致写代码的时候出现了死循环,而且有一个误区是,如果当前节点和路径上的下一个节点不相等时,此时我要不要直接返回false断绝此路径上继续下探的可能,答案是要,因为只有这样找到的路径才是连续的正确的。
还有一个疑问是我擅自在代码中写了如果当前节点和路径上的下一个节点不相等时,并且匹配的是第一个字符时,就允许范围其周围的节点进行结果遍历,但是这样会导致当第一个字符和0,0坐标不匹配时代码陷入死循环,因此是错误的,所以还是要老实使用下面的遍历方法。

public class Solution {
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
            int[] flag = new int[rows * cols];
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    if (help(matrix, rows, cols, str, 0, flag, i, j))
                        return true;
                }
            }
            return false;


        }

    public boolean help(char[] matrix, int rows, int cols, char[] str, int cur, int[] flag, int r, int c) {
            //int row, int col表明当前的坐标的行列值
            //flag表明那些曾经在路径中出现过的节点的坐标
            //cur表示当前需要匹配的字符的位置,是下一个待访问的节点,不需关系其有效性,因为最后一个元素是‘、0’
            int index = cols * r + c;
            if (r >=