基本递归,注意用#标记matrix中已经走过的路径,递归完后复原路径。
class Solution {
public:
char* matrix, *str;
int rows, cols, len;
bool hasPath2(int i, int j, int index) {
if (index == len - 1) return true;
bool res = false;
char tmp = matrix[i * cols + j];
matrix[i * cols + j] = '#';
if (i > 0 && matrix[(i - 1) * cols + j] == str[index + 1]) res = res || hasPath2(i - 1, j, index + 1);
if (i < rows - 1 && matrix[(i + 1) * cols + j] == str[index + 1]) res = res || hasPath2(i + 1, j, index + 1);
if (j > 0 && matrix[i * cols + j - 1] == str[index + 1]) res = res || hasPath2(i, j - 1, index + 1);
if (j < cols - 1 && matrix[i * cols + j + 1] == str[index + 1]) res = res || hasPath2(i, j + 1, index + 1);
matrix[i * cols + j] = tmp;
return res;
}
bool hasPath(char* matrix, int rows, int cols, char* str) {
len = 0;
while (str[len] != '\0') len++;
if (len == 0 || rows == 0 || cols == 0) return false;
this->matrix = matrix;
this->str = str;
this->rows = rows;
this->cols = cols;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (matrix[i * cols + j] == str[0]) {
if (hasPath2(i, j, 0)) return true;
}
}
}
return false;
}
};

京公网安备 11010502036488号