1.考点
- 考点1:试探回溯法的运用:这个方法说穿了就是迷宫寻径,被称为“蛮力法”的升级版确实不为过,主要就是在各个方向不断地向前试探,直到试探到尽头则依次回溯。这种方法没有最快的到达终点的办法,一直都是属于有哪条路就走哪条路,某种意义上和深度优先搜索算法比较接近,不过试探回溯的本质是有序的,深度优先搜索的本质是无序的。
- 考点2:对于递归与试探回溯的联合运用:试探回溯法的中的回溯操作,往往是借助递归或者栈的方式来实现的,而这两种情况,我个人认为,递归适用于没有节点结构体的情况,这样可以将数据的灵活性发挥到最大;而有节点结构体时,使用栈可能更佳,因为在栈中存读结构体是相当适用的。
2.代码
- 本题属于没有结构体的情况,本人尝试过使用结构体存储数据并用栈来实现回溯,但是这样做之后代码耦合性明显提升,整体的效率感觉也不太好,就不放上来了。总而言之就是对于这种题使用递归实现是相对较好的。
class Solution
{
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if (matrix == NULL || rows < 1 || cols < 1 || str == NULL)
return false;
int pathLength = 0;
bool *isVisited = new bool[rows*cols];
memset(isVisited, false, rows*cols);
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < cols; col++)
{
if (isHasPath(matrix, rows, cols, row, col, str, pathLength, isVisited))
{
return true;
}
}
}
return false;
}
bool isHasPath(char* matrix, int rows, int cols, int row, int col, char* str, int pathLength, bool* isVisited)
{
if (str[pathLength] == '\0')
return true;
bool hasPath = false;
if (row >= 0 && row < rows && col >= 0 && col < cols && matrix[row*cols + col] == str[pathLength] && !isVisited[row*cols + col])
{
++pathLength;
isVisited[row*cols + col] = true;
hasPath = isHasPath(matrix, rows, cols, row, col - 1, str, pathLength, isVisited)
|| isHasPath(matrix, rows, cols, row - 1, col, str, pathLength, isVisited)
|| isHasPath(matrix, rows, cols, row, col + 1, str, pathLength, isVisited)
|| isHasPath(matrix, rows, cols, row + 1, col, str, pathLength, isVisited);
if (!hasPath)
{
--pathLength;
isVisited[row*cols + col] = false;
}
}
return hasPath;
}
};