仓库源文站点原文


title: '算法:矩阵中的路径' cover: https://img.paulzzh.com/touhou/random?67 categories: 算法题目 date: 1996-07-27 08:00:00 tags: [算法题目, 回溯]

toc: true

<br/>

<!--more-->

矩阵中的路径

矩阵中的路径

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

例如矩阵

[a b c e]

[s f c s]

[a d e e]

中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。


分析

明显的四个方向的DFS + 回溯法;


代码

public class Solution {
    private boolean[] visited;

    private int level;

    public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
        visited = new boolean[rows * cols];

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                level = 0;
                if (helper(matrix, rows, cols, str, i, j)) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean helper(char[] matrix, int rows, int cols, char[] str, int curRow, int curCol) {
        if (curRow < 0 || curRow >= rows || curCol < 0 || curCol >= cols
                || visited[curRow * cols + curCol]
                || matrix[curRow * cols + curCol] != str[level]) return false;

        level++;
        visited[curRow * cols + curCol] = true;
        if (level == str.length) return true;

        boolean flag = false;
        flag = helper(matrix, rows, cols, str, curRow + 1, curCol)
                || helper(matrix, rows, cols, str, curRow, curCol + 1)
                || helper(matrix, rows, cols, str, curRow - 1, curCol)
                || helper(matrix, rows, cols, str, curRow, curCol - 1);

        if (!flag) {
            level--;
            visited[curRow * cols + curCol] = false;
        }
        return flag;
    }
}