题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

思路:首先得找到矩阵的起始点,若有多个起始点,则分别进行dfs,要多加注意的是起始点的位置也得重置成false,还有注意坐标的合法性。

class Solution {
public:
int x[4] = { 1,-1,0,0 };
int y[4] = { 0,0,1,-1 };
bool flags[20][20] = { false };
bool flagf = false;
void dfs(int i, int j, vector<vector<char> > &vv, char*str, int index, int rows, int cols,int len)
{
if (str[index] != vv[i][j]) return;
flags[i][j] = true;
if (index==len-1)
{
flagf = true;
return;
}
for (int k = 0; k < 4; k++)
{
if (i + x[k] >= 0 && j + y[k] >= 0 && i + x[k] < rows&&j + y[k] < cols && !flags[i + x[k]][j + y[k]])
{
dfs(i + x[k], j + y[k], vv, str, index + 1, rows, cols,len);
flags[i + x[k]][j + y[k]] = false;
}
}
}
bool hasPath(char* matrix, int rows, int cols, char* str)
{
vector<vector<char> > vv;
vector<char> v;
int c = 0;
for (int i = 0; i < rows; i++)
{
v.clear();
for (int j = 0; j < cols; j++)
{
v.push_back(matrix[c++]);
}
vv.push_back(v);
}
if (str[0] == '\0') return false;
int len = 0;
while (str[len] != '\0')
{
len++;
}
char start = str[0];
int starti, startj;
bool flag = false;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
if (start == vv[i][j])
{
starti = i;
startj = j;
int index = 0;
dfs(starti, startj, vv, str, index, rows, cols,len);
if (flagf)
return flagf;
flags[starti][startj] = false;
}
}
return false;
}
};