矩阵中的路径(经典dfs)

矩阵中的路径

http://www.nowcoder.com/questionTerminal/2a49359695a544b8939c77358d29b7e6

  • 出口:
    当word 下标走到数组大小,代表找到word
    当x,y 超出边界,或该数被访问,或matrix位置字符不与word的位置上的相同 都结束返回false。
    if(index == word.size()) return true;
    if(x < 0 || x >= matrix.size() || y < 0 || y >= matrix[0].size() || visited[x][y] || word[w_index] != matrix[x][y]) return false;

  • 操作:
    visited[x][y] = true;
    w_index++;

  • 递归:
    dfs(matrix, x + dirt[i], y + dirt[i+1], w_index, word, visited);

  • 回溯:
    visited[x][y] = false;

    class Solution {
    public:
      vector<int> dirt = {1, 0, -1, 0, 1}; // 定义的方向数组
      bool hasPath(vector<vector<char> >& matrix, string word) {
          vector<vector<bool> > visited(matrix.size(),vector<bool>(matrix[0].size(),0));  //定义与matrix 同样大小的 访问数组
    
          for(int i = 0; i < matrix.size(); i++){
              for(int j = 0; j < matrix[0].size(); j++){
                   if(dfs(matrix, i, j, 0, word, visited))return true;  // 必须对每一个数进行dfs搜索,找到直接返回true
              }
          }
         return false; // 否则返回 false
      }
    
      bool dfs(vector<vector<char> >& matrix, int x, int y, int w_index, string word, vector<vector<bool> >& visited){
          if(w_index == word.size()) return true; // 当word 下标走到数组大小,代表找到word
    // 当x,y 超出边界,或该数被访问,或matrix位置字符不与word的位置上的相同 都结束返回false。
          if(x < 0 || x >= matrix.size() || y < 0 || y >= matrix[0].size() || visited[x][y] ||word[w_index] != matrix[x][y]) return false;
          w_index++; // 该点符合要求 ,word下标后移 标记访问
          visited[x][y] = true;
          bool isExist = false;
          for(int i = 0; i < 4; i++){ // 四个方向递归 且结果||
              isExist = isExist || dfs(matrix, x + dirt[i], y + dirt[i+1], w_index, word, visited);
          }
    
          visited[x][y] = false; // 有& 是引用 递归结束后需要回溯。
    
          return isExist; // 返回结果
      }
    };
全部评论
isExist = isExist || dfs(matrix, x + dirt[i], y + dirt[i+1], w_index, word, visited); 这里为什么会有个||,这个||用途是什么
点赞 回复 分享
发布于 2021-06-09 18:59

相关推荐

评论
5
2
分享
牛客网
牛客企业服务