矩阵中的路径(经典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; // 返回结果 } };