您的位置:首页 > 其它

【剑指**】12.矩阵中的路径

2018-01-09 15:14 405 查看

12.矩阵中的路径

思路源自书上的。回溯法

但是有一个问题,我仿照书上的代码,自己写了一遍,逻辑一模一样,只是个别变量不同。但是 牛客网上 怎么搞也通不过。用书上的代码是可以通过的。

对比了半天也没发现区别所在。不知道是代码的问题,还是oj的问题。

我的代码

class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if (matrix == NULL || rows <= 0 || cols <= 0 || str == NULL) return false;
vector<bool> visited(false, rows*cols);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
int pathlength = 0;
if (help(matrix, rows, cols, i,j,str,pathlength,visited)) {
return true;
}
}
}
return false;
}
bool help(char* matrix, int rows, int cols, int r, int c, char* str, int& pathlength,
vector<bool>& visited) {
if (str[pathlength] == '\0') return true;

bool hasPath = false;
if (r >= 0 && r < rows && c >= 0 && c <= cols
&& matrix[r*cols + c] == str[pathlength]
&& !visited[r*cols + c]) {
++pathlength;
visited[r*cols + c] = true;
hasPath = help(matrix, rows, cols,r,c-1, str, pathlength, visited)
|| help(matrix, rows, cols,r-1,c, str, pathlength, visited)
|| help(matrix, rows, cols,r,c+1, str, pathlength, visited)
|| help(matrix, rows, cols,r+1,c, str, pathlength, visited);
if (!hasPath) {
--pathlength;
visited[r*cols+c] = false;
}
}
return hasPath;
}
};


书上的代码

class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if (matrix == NULL || rows < 1 || cols < 1 || str == NULL)
return false;
bool* visited = new bool[rows*cols];              //定义一个辅助矩阵,用来标记路径是否已经进入了每个格子
memset(visited, 0, rows*cols);
int pathLength = 0;
for (int row = 0;row < rows;++row)                //该循环是为了实现从任何一个位置出发,寻找路径
{
for (int col = 0; col < cols;++col)
{
if (hasPathCore(matrix, rows, cols, row, col, str, pathLength, visited))
return true;
}
}
delete[] visited;
return false;
}

/*此函数用来判断在当前路径满足条件下,相邻格子中是否存在一个格子满足条件*/
bool hasPathCore(char* matrix, int rows, int cols, int row, int col, char* str, int& pathLength, bool* visited)
{
if (str[pathLength] == '\0')
return true;
bool hasPath = false;
if (row >= 0 && row < rows&&col >= 0 && col < cols&&matrix[row*cols + col] == str[pathLength] && !visited[row*cols + col])
{
++pathLength;
visited[row*cols + col] = true;
/*如果矩阵格子(row,col)与路径字符串中下标为pathLength的字符一样时,
从它的4个相邻格子中寻找与路径字符串下标为pathLength+1的字符相等的格子*/
hasPath = hasPathCore(matrix, rows, cols, row, col - 1, str, pathLength, visited) ||
hasPathCore(matrix, rows, cols, row - 1, col, str, pathLength, visited) ||
hasPathCore(matrix, rows, cols, row, col + 1, str, pathLength, visited) ||
hasPathCore(matrix, rows, cols, row + 1, col, str, pathLength, visited);
if (!hasPath)
{
--pathLength;           //如果没找到,则说明当前第pathLength个字符定位不正确,返回上一个位置重新定位
visited[row*cols + col] = false;
}
}
return hasPath;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: