矩阵中的路径(回溯法)

问题描述

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

解题思路

使用回溯法解决此题,设置一个和矩阵大小相同的布尔型数组表示是否已经访问。每次访问一个点,递归的访问其向左、向右、向上、向下未被访问且与字符串下一个字符相同的点。

实现代码

public class HasPath {

    private boolean[][] table;   // 辅助矩阵,已访问的点记为true
    private int rows, cols;      // 矩阵的行数与列数
    private char[] matrix;       // 字符矩阵(一维表示二维)
    private char[] str;          // 字符串
    private boolean res = false; // 矩阵中是否存在一条包含字符串所有字符的路径

    // 从点(r,c)开始寻找下一个满足要求的点
    // 在点(r,c)的上下左右,且未被访问,且字符与str[n]相同
    private void test(int r, int c, int n) {
        if (res) return;
        if (n == str.length) {
            res = true;
            return;
        }

        System.out.println("r=" + r + "   c=" + c + "   n=" + n);

        if (r>0 && !table[r-1][c] && str[n]==matrix[cols*(r-1)+c]) {
            table[r-1][c] = true;
            test(r-1, c, n+1);
            table[r-1][c] = false;
        }
        if (r+1<rows && !table[r+1][c] && str[n]==matrix[cols*(r+1)+c]) {
            table[r+1][c] = true;
            test(r+1, c, n+1);
            table[r+1][c] = false;
        }
        if (c>0 && !table[r][c-1] && str[n]==matrix[cols*r+c-1]) {
            table[r][c-1] = true;
            test(r, c-1, n+1);
            table[r][c-1] = false;
        }
        System.out.println(matrix[cols*r+c]);
        if (c+1<cols && !table[r][c+1] && str[n]==matrix[cols*r+c+1]) {
            table[r][c+1] = true;
            test(r, c+1, n+1);
            table[r][c+1] = false;
        }
    }

    public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
        this.matrix = matrix;
        this.rows = rows;
        this.cols = cols;
        this.str = str;
        table = new boolean[rows][cols];

        int r, c;       // 表示字符矩阵的行与列(一维/二维换算)
        // 寻找matrix中的起始点,即与str[0]相同的点
        for (int i=0; !res && i<matrix.length; i++) {
            if (matrix[i] == str[0]) {
                r = i/cols; c = i - cols*r;
                table[r][c] = true;
                test(r, c, 1);
                table[r][c] = false;
            }
        }
        return res;
    }




    // 测试
    public static void main(String[] args) {
        HasPath path = new HasPath();
        char[] matrix = "ABCESFCSADEE".toCharArray();
        int rows = 3;
        int cols = 4;
        char[] str = "ABCCED".toCharArray();
        System.out.println(path.hasPath(matrix, rows, cols, str));
        
    }
}
原文地址:https://www.cnblogs.com/deltadeblog/p/9596901.html