66 - 矩阵中的路径

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

例如在下面的 3*4 的矩阵中包含一条字符串“bcced”的路径。但矩阵中不包含字符串“abcb”的路径,因为字符串的第一个字符 b 占据了矩阵中的第一行第二格子之后,路径不能再次进入这个格子。

a b c e
s f c s
a d e e

回溯法。在矩阵中任选一个格子作为路径起点。如果该格子能匹配路径中的位置,则以该格子为中心,分别向上下左右继续匹配路径。如果后续格子不能匹配成功,逐步退回上一个路径中的位置重新匹配。

当矩阵中定位到路径中前 n 个字符匹配时,在第 n 个字符对应格子的周围都没有路径中第 n+1 个字符的匹配,这时,需要退回到第 n-1 字符,重新定位第 n 个字符。

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
bool hasPathCore(const vector<char> &matrix,const int &rows,const int &cols, int row, int col,
                const vector<char> &pattern, int &pattern_index, vector<bool> &visited, stack<char> &path);

bool hasPath(const vector<char> &matrix,const int &rows, const int &cols, const vector<char> &pattern, stack<char> &path) {
    if (matrix.size() <= 0 || rows < 1 || cols < 1 || pattern.size() <= 0)
        return false;
    vector<bool> visited(matrix.size());
    for (int i = 0; i < visited.size(); i++)
        visited[i] = false;
    int pattern_index = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (hasPathCore(matrix, rows, cols, i, j, pattern, pattern_index, visited, path)) {
                // 起点
                return true;
            }
        }
    }
    return false;
}

bool hasPathCore(const vector<char> &matrix,const int &rows,const int &cols, int row, int col,
                const vector<char> &pattern, int &pattern_index, vector<bool> &visited, stack<char> &path) {
    if (matrix.size() < 1 || rows < 1 || cols < 1 || row < 0 || col < 0 || pattern.size() < 1)
        return false;
    bool foundPath = false;
    if (row < rows && col < cols && matrix[row*cols + col] == pattern[pattern_index] && !visited[row*cols + col]) {
        // 矩阵的当前字符 等于 pattern 的当前字符
        visited[row*cols + col] = true;
        path.push(matrix[row*cols + col]);
        pattern_index++;
        if (pattern_index == pattern.size()) // 匹配完成
            return true;
        // 分别向当前字符的四个方向上开始匹配
        foundPath = hasPathCore(matrix, rows, cols, row-1, col, pattern, pattern_index, visited, path) ||
            hasPathCore(matrix, rows, cols, row, col-1, pattern, pattern_index, visited, path) ||
            hasPathCore(matrix, rows, cols, row+1, col, pattern, pattern_index, visited, path) ||
            hasPathCore(matrix, rows, cols, row, col+1, pattern, pattern_index, visited, path);
        if (!foundPath) {
            // 此路径不存在匹配,退回,重新匹配上一个字符
            pattern_index--;
            visited[row*rows + col] = false;
            path.pop();
        }
    }
    return foundPath;
}

int main() {
    string matrix_str= "abcesfcsadee";
    vector<char> matrix(matrix_str.begin(), matrix_str.end());
    string pattern_str = "cceda";
    vector<char> pattern(pattern_str.begin(), pattern_str.end());
    stack<char> path; // 存储路径,可以扩展,如找出包含给定节点的路径
    cout << hasPath(matrix, 3, 4, pattern, path) << endl;
    cout << path.size() << endl;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 14:10:59

66 - 矩阵中的路径的相关文章

《剑指offer》:[66]矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子. 具体是例如下图: 上图中"bcced"就存在这条路径:但是"abcb"这条路径就不存在.因为进入'b'这个格子后就不能再次进入. 解决方案:主要是用回溯法.首先任意选一个入口地址,也就是任选一个格子,如果格子中的字符ch和字符串中的第一个字符相等,

矩阵中的路径-剑指Offer

矩阵中的路径 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子.

《剑指offer》第十二题:矩阵中的路径

// 面试题12:矩阵中的路径 // 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有 // 字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右. // 上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入 // 该格子.例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字 // 母用下划线标出).但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个 // 字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入

矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子. 回溯法: public

剑指offer(六十五)之矩阵中的路径

题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子. 代码: /*

[剑指Offer] 65.矩阵中的路径

题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. 例如[a b c e s f c s a d e e]是3*4矩阵,其包含字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子. [思路

《剑指offer》矩阵中的路径

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/c61c6999eecb4b8f88a98f66b273a3cc?rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵

剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)

题目描述  请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. 例如: a   b  c   e s   f   c   s  a  d   e   e  矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后

回溯法 矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子. 这是一个可以用回溯法解决的经典题.首先,在矩阵中任选一个格子作为路径的起点.假设矩阵中某个格子的字符为ch,并且这个格子将对应于路径上的第i个字符.如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置.如果路径上的第i个字符正好是ch,那么到相邻的格子寻找路