题解 | #矩阵中的路径#

矩阵中的路径

http://www.nowcoder.com/practice/2a49359695a544b8939c77358d29b7e6

第五十题 回溯第一题
一开始看代码挺长的,起始很简单,注意回溯返回之前状态的时候所有东西都要回到之前的状态。所以递归调用的时候没有用引用
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型vector<vector<>> 
     * @param word string字符串 
     * @return bool布尔型
     */
    bool hasPath(vector<vector<char> >& matrix, string word) {
        // write code here
        bool ans=false;
        // 遍历一遍二维数组 如果说遇到了和word一样字,就进入后面的判断
        for(int i=0;i<matrix.size();i++)
        {
            for(int j=0;j<matrix[0].size();j++)
            {
                if(matrix[i][j]==word[0])
                {
                    ans=findways(matrix,word,i,j);
                    if(ans==true)
                        return ans;
                }
            }
        }
        return ans;
    }
    
    // 递归判断结果是否是正确的
    // 思考为什么不能用引用传递参数
//     bool findways(vector<vector<char>> & matrix, string word,int i,int j){
    // 因为是回溯,所以matrix这里传递的参数不是引用,这样每次进来的东西修改了,如果结果不对,也不会变
    // 后面把matrix[i][j]设置为空了,如果说是引用的话,则即使结果不对,matrix是引用,回溯的时候也被修改了,之后再回来的时候就出错了。
    bool findways(vector<vector<char>> matrix, string word,int i,int j){
        // 首先先把第一个匹配到的字符删除,字符串也删除
        // 思考:在哪些情况要删除?递归回溯的时候还要不要?
        matrix[i][j]=NULL;
        word.erase(word.begin());
        // 递归结束的条件,字符串全部删完了,则结果正确
        if(word.size()==0)
            return true;
        // 记录答案
        bool retans=false;
        
        // 下面是上下左右四个方向找结果,如果能匹配,就递归调用
        // 注意这里用的&& 是要先判断是不是在范围里面,再访问值的,如果反了,就会有数组越界错误
        if((i-1)>=0 && matrix[i-1][j]==word[0])
        {
            // 访问上一个结点 matrix是修改过的,因为传递的参数不是引用,所以如果答案不正确,也不会使得matrix被修改
            retans=findways(matrix, word, i-1, j);
            if(retans==true)
                return retans;
        }
        // 下面三个一样,最后返回结果
        if( (i+1)<matrix.size() && matrix[i+1][j]==word[0])
        {
            retans=findways(matrix, word, i+1, j);
            if(retans==true)
                return retans;
        }
        if( (j-1)>=0 && matrix[i][j-1]==word[0])
        {
            retans=findways(matrix, word, i, j-1);
            if(retans==true)
                return retans;
        }
        if( (j+1)<matrix[0].size() && matrix[i][j+1]==word[0])
        {
            retans=findways(matrix, word, i, j+1);
            if(retans==true)
                return retans;
        }
        return retans;
        
    }
};
题解 文章被收录于专栏

一遍做剑指offer 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务