矩阵中的路径
题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
学到个新算法, 回溯法, 总体思路就是递归, 一步步层层调用, 设置判断条件, 分别上下左右探索单元格四周
class Solution {
public:
bool hasPathCore(const char* matrix, int rows, int cols, int row, int col,
const char* str, int &pathLength, bool *visited) {
if ('\0' == str[pathLength])
return true;
bool hasPath = false;
if ((row >= 0) && (row < rows) && (col >= 0) && (col < cols) // 边界条件判断
&& (visited[cols * row + col] == false) // 单元格没有被访问过
&& (matrix[cols * row + col] == str[pathLength])) { // 单元格字符和路径上的字符相同
visited[cols * row + col] = true; // 把路径设置为访问过
pathLength++; // 字符中的路径+1
hasPath = hasPathCore(matrix, rows, cols, row + 1, col, str, pathLength, visited) // 向下探索
|| hasPathCore(matrix, rows, cols, row, col + 1, str, pathLength, visited) // 向右探索
|| hasPathCore(matrix, rows, cols, row - 1, col, str, pathLength, visited) // 向上探索
|| hasPathCore(matrix, rows, cols, row, col - 1, str, pathLength, visited); // 向左探索
if (! hasPath) { // 若没有找到
pathLength--; // 字符路径-1
visited[cols * row + col] = false; // 单元格设置为没访问过
}
}
return hasPath;
}
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if ((nullptr == matrix) || (nullptr == str) || (rows < 1) || (cols < 1))
return false;
bool *visited = new bool[rows * cols]; // 用来记录单元格是否被访问过
//memset(visited, 0, sizeof(*visited)); // 设置0失败
memset(visited, 0, rows * cols);
int pathLength = 0;
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
if (hasPathCore(matrix, rows, cols, row, col, str, pathLength, visited)) { // 找到这条路径
delete[] visited;
return true;
}
}
}
// 没有找到这条路径
delete[] visited;
return false;
}
};