【劍指**】12.矩陣中的路徑

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章