剑指OFFER_矩阵中的路径
剑指OFFER_矩阵中的路径
题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 $\begin{bmatrix} a & b & c &e \ s & f & c & s \ a & d & e& e\ \end{bmatrix}\quad $矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
思路
牛客网给出的函数模板感觉怪怪的,明明是C++的编译器,用的面向对象,但是函数使用的C风格;
而且矩阵还是用的一维数组,需要手动转换成二维的,emmm,感觉怪怪的,下次还是刷LeetCode的剑指OFFER;
思路是这样的,使用一个递归函数从上下左右四个方向搜索,判断当前格子里面的字符是否和字符串的相等;
如果相等则继续向下搜索,然后字符串的指针+1,只有在搜索到最后一个字符的时候,如果依然相等,则返回真,这样DFS函数返回真的时候,表示字符串整体匹配;
C语言的字符串结尾是'\0',所以代码中判断是否是最后一个字符的依据是下一个字符是否是'\0',就表示是否搜索到底了,差不多就是这样,代码如下:
代码
class Solution {
public:
int *vis;
int row, col;
bool dfs(int x, int y, const char *matrix, const char *str) {
if (x<0 || x>=row || y<0 || y>=col) {
return false;
}
int pos = x*col+y;
if (vis[pos]) {
return false;
}
if (*str != *(matrix+pos)) {
return false;
} else if ('\0' == *(str+1)) {
return true;
}
vis[pos] = 1;
if (dfs(x+1, y, matrix, str+1)){
vis[pos] = 0;
return true;
}
if (dfs(x-1, y, matrix, str+1)){
vis[pos] = 0;
return true;
}
if (dfs(x, y+1, matrix, str+1)){
vis[pos] = 0;
return true;
}
if (dfs(x, y-1, matrix, str+1)){
vis[pos] = 0;
return true;
}
vis[pos] = 0;
return false;
}
bool hasPath(char* matrix, int rows, int cols, char* str)
{
row = rows; col = cols;
vis = new int[rows*cols];
memset(vis, 0, rows*cols*sizeof(int));
for (int i=0; i<rows; i++) {
for (int j=0; j<cols; j++) {
if (dfs(i, j, matrix, str)) {
return true;
}
}
}
return false;
}
};