剑指Offer——矩阵中的路径

题目描述

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

例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

a b c e

s f c s

a d e e

解题思路

  这是一个可以用回朔法解决的典型题。所谓回溯法就是按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。具体到这道题目,首先遍历矩阵,字符串首字母所在的位置,然后对于每个字符,如果在矩阵中找到了其在矩阵中的位置,进行下一次寻找的时候,可以从上、下、左、右四个方向(注意对边界的判断)进行递归寻找,如果找到了则继续寻找下一个字符;如果没有找到的话,则回到上一个字符重新寻找。直到找到全部字符在矩阵中对应的位置。

代码

/*
     * matrix 输入矩阵
     * rows   矩阵行数
     * cols   矩阵列数
     * str    要搜索的字符串
     */
class Solution {
public:
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        if( strlen(matrix) == 0 || strlen(matrix) != rows * cols || str == NULL )
            return false;
        used = vector<bool> (strlen(matrix), false);
        for( int i=0;i<rows;i++ )
            for( int j=0;j<cols;j++ )
                if( help(matrix, rows, cols, i, j, str, 0 ) )
                    return true;
        return false;
    }
    
    vector<vector<int>> way = {{0,-1},{0,1},{-1,0},{1,0}};
    vector<bool> used;
    
    bool help(char* matrix, int rows, int cols, int rth, int cth, char* str, int num )
    {
        if( str[num] == '\0' )
            return true;
        if( rth*cols+cth >= strlen(matrix) )
            return false;
        if( used[rth*cols+cth] )
            return false;
        if( matrix[rth*cols+cth] != str[num] )
            return false;
        
        used[rth*cols+cth] = true;
        for( int i=0;i<4;i++ )
            if( help(matrix, rows, cols, rth+way[i][0], cth+way[i][1], str, num+1 ) )
                return true;
        used[rth*cols+cth] = false;
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值