题解 | #矩阵中的路径#

矩阵中的路径

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

class Solution {
  private:
    bool hasNext(int x, int y, int pathLen, string word,
                 vector<vector<char> >& matrix) {
        /*
        @brief: 在指定位置的元素周围相邻位置找下一个节点
        @param:
            dir: 来的方向 1 从左往右  2 从上往下  3 从右往左 4 从下往上
            wordLen: 当前的长度
        */
        if (pathLen == word.size()) {
            return true;
        }
        if (x < 0 || x >= matrix.size() || y < 0 || y >= matrix[0].size() ||
                matrix[x][y] != word[pathLen]) {
            return false;
        }
        pathLen++;
        char temp = matrix[x][y];  //  回溯
        matrix[x][y] = '#';  //不为26个字母的都可以,用于标记已走过的路径
        bool found = hasNext(x + 1, y, pathLen, word, matrix) ||
                     hasNext(x - 1, y, pathLen, word, matrix) ||
                     hasNext(x, y + 1, pathLen, word, matrix) ||
                     hasNext(x, y - 1, pathLen, word, matrix);
        matrix[x][y] = temp;  // 回溯

        return found;
    }

  public:
    bool hasPath(vector<vector<char> >& matrix, string word) {
        int col = matrix[0].size();
        int row = matrix.size();

        // 为空的判断
        if (matrix.empty() || word.empty()) {
            return false;
        }

        for (int i = 0; i < col; i++) {
            for (int j = 0; j < row; j++) {
                if (matrix[j][i] == word[0]) {
                    if (hasNext(j, i, 0, word, matrix)) return true;
                }
            }
        }
        return false;
    }
};

全部评论

相关推荐

勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务