Java教程

矩阵中的路径(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 };
这篇关于矩阵中的路径(DFS)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!