其他分享
首页 > 其他分享> > 矩阵中的路径(DFS)

矩阵中的路径(DFS)

作者:互联网

矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。

如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。

注意:

数据范围

矩阵中元素的总个数 [0,900]。
路径字符串的总长度 [0,900]。

样例

matrix=
[
  ["A","B","C","E"],
  ["S","F","C","S"],
  ["A","D","E","E"]
]

str="BCCE" , return "true" 

str="ASAE" , return "false"

 

 1 class Solution {
 2 public:
 3     static constexpr int g_direction[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 上、右、下、左四个方向
 4     bool hasPathHelper(const vector<vector<char>> &matrix, int x, int y, 
 5         const string &str, int &pathLength, vector<vector<bool>> &visited) {
 6         // DFS出口:字符串全部匹配完
 7         if (str[pathLength] == '\0') {
 8             return true;
 9         }
10         int row = matrix.size();
11         int cow = matrix[0].size();
12         bool hasPath = false;
13         // 1、元素在范围内;2、待匹配元素与字符串中字符匹配;3、元素未被访问过
14         if ((x >= 0 && x < row) && (y >= 0 && y < cow) && (matrix[x][y] == str[pathLength]) && !visited[x][y]) {
15             visited[x][y] = true;
16             pathLength++;
17             for (int i = 0; i < 4; i++) {
18                 int xNext = x + g_direction[i][0];
19                 int yNext = y + g_direction[i][1];
20                 if (hasPathHelper(matrix, xNext, yNext, str, pathLength, visited)) {
21                     hasPath = true;
22                     break;
23                 }
24             }
25             // 回溯
26             if (!hasPath) {
27                 visited[x][y] = false;
28                 pathLength--;
29             }
30         }
31         return hasPath;
32     }
33     bool hasPath(vector<vector<char>>& matrix, string &str) {
34         if (matrix.size() == 0 || matrix[0].size() == 0 || str.empty()) {
35             return false;
36         }
37         int row = matrix.size();
38         int cow = matrix[0].size();
39         vector<vector<bool>> visited(row, vector<bool>(cow, false)); // 标记元素是否被访问过
40         int pathLength = 0; // 字符串中匹配的字符索引
41         for (int i = 0; i < row; i++) {
42             for (int j = 0; j < cow; j++) {
43                 if (hasPathHelper(matrix, i, j, str, pathLength, visited)) {
44                     return true;
45                 }
46             }
47         }
48         return false;
49     }
50 };

标签:return,matrix,int,路径,矩阵,DFS,str,pathLength,visited
来源: https://www.cnblogs.com/MGFangel/p/16157931.html