剑指 Offer 12. 矩阵中的路径 - 7月23日

Posted boyscrytoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 12. 矩阵中的路径 - 7月23日相关的知识,希望对你有一定的参考价值。

题目

剑指 Offer 12. 矩阵中的路径

技术图片

我的思路

深度优先搜索,递归实现。

注意剪枝时需要恢复没走过的路径。

我的实现

class Solution {
public:
    bool search(int cor_x,int cor_y,int str_pos,vector<vector<char>>& board, string &word,vector<vector<int>> &map_records){
        //出口条件
        if (board[cor_x][cor_y]!=word[str_pos]||map_records[cor_x][cor_y]!=0){
            return false;
        }else{//字符匹配
            map_records[cor_x][cor_y]=1;
            if(str_pos==word.size()-1){//如果已经遍历完目标字符串
            return true;
            }
            bool result = false;
            if(cor_x<board.size()-1) result=result||search(cor_x+1,cor_y,str_pos+1,board,word,map_records);
            if(cor_y<board[0].size()-1) result=result||search(cor_x,cor_y+1,str_pos+1,board,word,map_records);
            if(cor_x>0) result=result||search(cor_x-1,cor_y,str_pos+1,board,word,map_records);
            if(cor_y>0) result=result||search(cor_x,cor_y-1,str_pos+1,board,word,map_records);
            if(result==false){
                 map_records[cor_x][cor_y]=0;//关键一步,把走过但走不通的路径记录恢复为没走过
            }
            return result;
        }
    }
    bool exist(vector<vector<char>>& board, string word) {
        vector<int> line(board[0].size(),0);
        vector<vector<int>> map_records(board.size(),line);
        for(int i =0;i<board.size();i++){
            for(int j=0;j<board[0].size();j++){
                //printf("check%d %d
",i,j);
                if(search(i,j,0,board,word,map_records)){
                    return true;
                }
            }
        }
        return false;
    }
};
/*
直接用递归搜索?

*/

时间复杂度3k*m*m

空间复杂度m*n

拓展学习

以上是关于剑指 Offer 12. 矩阵中的路径 - 7月23日的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径

剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径

剑指 Offer(C++版本)系列:剑指 Offer 12 矩阵中的路径

图论刷题-2剑指 Offer 12. 矩阵中的路径

图论刷题-2剑指 Offer 12. 矩阵中的路径

java刷题-剑指offer 12 矩阵中的路径