zoukankan      html  css  js  c++  java
  • 矩阵中的路径(剑指offer_12)

    题目描述


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

    例如下面的矩阵包含了一条bfce路径。

    解题思路


    使用回溯法(backtracking)进行求解,它是一种暴力搜索算法,通过搜索所有可能的结果来求解问题。回溯法在一次搜索结束时需要进行回溯(回退),将这一次搜索过程中设置的状态进行清除,从而开始一次新的搜索过程。例如下图示例中,从f开始,下一步有4种搜索可能,如果先搜b,需要将b标记为已经使用,防止重复使用。在这一次搜索结束之后,需要将b的已经使用状态清除,并搜索c。

    本题的输入是数组不是矩阵(二维数组),需要将数组先转换为矩阵。

    private  final static int[][] next = {{0,-1},{0,1},{-1,0},{1,0}};
    private int rows;
    private int cols;
    
    public boolean hasPath(char[] array, int rows,int cols,char[] str)
    {
        if(rows == 0||cols == 0) 
            return false;
        this.rows = rows;
        this.cols = cols;
        boolean[][] marked = new boolean[rows][cols];
        char[][] matrix = buildMatrix(array);
        for(int i = 0;i< rows;i++)
            for(int j = 0; j < cols; j++)
            {
                if(backtracking(matrix,str,marked,0,i,j))
                    return true;
            }
            return false;
    }
    
    
    private boolean backtracking(char[][] matrix, char[] str, boolean[][] marked, int pathLen, int r,int c)
    {
        if(pathLen == str.length)
            return true;
        if(r<0 || r>=rows || c<0 || c>=cols || matrix[r][c] != str[pathLen] || marked[r][c])
        {
            return false;
        }
        marked[r][c] = true;
        for (int[] n : next)
            if(backtracking(matrix, str, marked, pathLen + 1, r + n[0],c + n[1]))
                return true;
        marked[r][c] = false;
        rerturn false;
    }
    
    private char[][] buildMatrix(char[] array)
    {
        char[][] matrix = new char[rows][cols];
        for (int r = 0, idx = 0; r < rows; r++)
            for (int c = 0; c < cols; c++)
                matrix[r][c] = array[idx++];
        return matrix;
    }
  • 相关阅读:
    冒泡排序
    选择排序
    1069 微博转发抽奖 (20 分)
    动态规划-石子合并
    动态规划-最长公共子序列
    动态规划-最长上升子序列
    动态规划-数字三角形
    动态规划-分组背包问题
    动态规划-多重背包问题
    动态规划-完全背包问题
  • 原文地址:https://www.cnblogs.com/ziytong/p/12101613.html
Copyright © 2011-2022 走看看