题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
class Solution {
public:
//DFS,枚举起点
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if (matrix == nullptr || str == nullptr || str[0] == '\0' || rows <= 0 || cols <= 0)
return false;
bool* vis = new bool[rows*cols];
for (int i = 0; i < rows*cols; ++i)
vis[i] = false;
for (int i = 0; i < rows*cols; ++i)
if(dfs(matrix, vis, rows, cols, i, str))
{
delete vis;
return true;
}
return false;
}
private:
int dir[4][2] = {
{1,0},{-1,0},{0,-1},{0,1}};
bool dfs(char* matrix, bool* vis, int rows, int cols, int now, char* str)
{
int r = now/cols, c = now%cols;
if (now < 0 || now >= rows*cols || vis[now] || matrix[now] != *str)
return false;
if (*(str+1) == '\0')
return true;
vis[now] = true;
for (int i = 0; i < 4; ++i)
{
if (dfs(matrix, vis, rows, cols, (r+dir[i][0])*cols + (c+dir[i][1]), str+1))
return true;
}
vis[now] = false;
return false;
}
};