ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

剑指offer系列——65.矩阵中的路径

2020-03-01 17:03:21  阅读:237  来源: 互联网

标签:rows matrix offer int 矩阵 cols 65 str array


Q:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
A:
类似这种题型都需要采用回溯法来解决,我们采用一位数组按行标记矩阵位置是否可以到达。起点位置不固定,遍历二维数组下标去试探。
回溯法通过递归实现,递归过程中,如果该位置越界、该位置不可达、该位置元素与str的字符不相等,都返回false。
当str+1指向'/0'时候,str走到了字符结尾位置,否则str向后移动。
该位置可达,继续向四周试探,试探之后,一定要将该位置置0,因为,不能走回头路。

    bool hasPath(char *matrix, int rows, int cols, char *str) {
        if (strlen(str) == 0 || str == nullptr)
            return false;
        bool *array = new bool[rows * cols];
        for (int i = 0; i < rows * cols; i++)
            array[i] = false;

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (hasPathOne(matrix, i, j, rows, cols, str, array)) {
                    delete[] array;
                    return true;
                }
            }
        }
        return false;
    }

    bool hasPathOne(char *matrix, int i, int j, int rows, int cols, char *str, bool *array) {
        int index = i * cols + j;
        if (i < 0 || j < 0 || i > rows || j > cols || array[index] || matrix[index] != *str)
            return false;
        if (*(str + 1) == '\0')
            return true;
        else
            str++;
        array[index] = true;
        if (hasPathOne(matrix, i - 1, j, rows, cols, str, array) ||
            hasPathOne(matrix, i + 1, j, rows, cols, str, array) ||
            hasPathOne(matrix, i, j - 1, rows, cols, str, array) ||
            hasPathOne(matrix, i, j + 1, rows, cols, str, array))
            return true;
        array[index] = false;
        return false;
    }

标签:rows,matrix,offer,int,矩阵,cols,65,str,array
来源: https://www.cnblogs.com/xym4869/p/12390300.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有