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;
}
};