ICode9

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

矩阵中的路径(DFS)

2022-04-18 00:04:41  阅读:113  来源: 互联网

标签:return matrix int 路径 矩阵 DFS str pathLength visited


矩阵中的路径

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

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

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

注意:

  • 输入的路径不为空;
  • 所有出现的字符均为大写英文字母;

数据范围

矩阵中元素的总个数 [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

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

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

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

ICode9版权所有