题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
解:
DFS的思想,加上回溯。
犯错:本来是cols,误写成了rows,导致运行结果不正确
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
string str2 = "";
while((*str) != '\0')
{
str2 += (*str);
str++;
}
string matrix2 = "";
while((*matrix) != '\0')
{
matrix2 += (*matrix);
matrix++;
}
int visit[matrix2.size() + 5];
for(int i = 0; i < matrix2.size(); i++)
{
if(matrix2[i] == str2[0])
{
memset(visit, 0, sizeof(visit));
visit[i] = 1;
if(DFS(matrix2, str2, 1, visit, i, rows, cols))
return true;
}
}
return false;
}
bool DFS(string mp, string str, int cnt, int visit[], int pos, int rows, int cols)
{
if(cnt == str.size())
{
return true;
}
for(int i = 0; i < 4; i++)//上下左右
{
int newPos;
switch(i)
{
case 0:
newPos = pos - cols;
break;
case 1:
newPos = pos + cols;
break;
case 2:
newPos = pos - 1;
break;
case 3:
newPos = pos + 1;
break;
}
if(newPos < 0 || newPos >= rows * cols)
continue;
if(pos % cols == 0 && i == 2)
continue;
if((pos + 1) % cols == 0 && i == 3)
continue;
if(visit[newPos] == 1)
continue;
if(str[cnt] != mp[newPos])
continue;
visit[newPos] = 1;
cnt++;
//cout << mp[newPos] << endl;
if(DFS(mp, str, cnt, visit, newPos, rows, cols))
return true;
else
{
visit[newPos] = 0;
cnt--;
}
}
return false;
}
};