zoukankan      html  css  js  c++  java
  • 剑指 Offer 64. 矩阵中的路径

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

    [["a","b","c","e"],
    ["s","f","c","s"],
    ["a","d","e","e"]]

    但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    使用回溯算法枚举搜索

     从每一个点向4个方向递归查询,枚举出所有路径。

    class Solution {
        
        public boolean exist(char[][] board, String word) {
            int row = board.length;
            //特例判断
            if(row <= 0 || board == null)
            {
                return false;
            }
            if(word.equals("") || word == null)
            {
                return true;
            }
            int cow = board[0].length;
            boolean[][] isVisted = new boolean[row][cow]; //用于判断是否重复经过
            for(int i = 0 ; i < row; i++)
            {
                for(int j = 0 ; j < cow ; j++)
                {
                    if(dfs(board,0,word,i,j,isVisted))
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        /**
    
        */
        public boolean dfs(char[][] board , int index , String word ,int x , int y , boolean[][] isVisted)
        {
            if( index > word.length() -1) //递归完成条件
            {
                return true;
            }
            //判断递归提前结束条件
            if(x < 0 || x > board.length -1 || y < 0 || y > board[0].length -1 
                    || isVisted[x][y] || board[x][y] != word.charAt(index))
            {
                return false;
            }
            isVisted[x][y] = true; //修改状态
            //往4个方向递归
            boolean res =  dfs(board,index+1,word,x,y+1,isVisted)
            ||dfs(board,index+1,word,x,y-1,isVisted)
            ||dfs(board,index+1,word,x-1,y,isVisted)
            ||dfs(board,index+1,word,x+1,y,isVisted);
    
            isVisted[x][y] = false; //恢复状态
    
            return res;
    
    
        }
    }
  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/swqblog/p/13920608.html
Copyright © 2011-2022 走看看