每日一題:二進制矩陣中的最短路徑

題目說明

在一個 N × N 的方形網格中,每個單元格有兩種狀態:空(0)或者阻塞(1)。

一條從左上角到右下角、長度爲 k 的暢通路徑,由滿足下述條件的單元格 C_1, C_2, …, C_k 組成:

相鄰單元格 C_i 和 C_{i+1} 在八個方向之一上連通(此時,C_i 和 C_{i+1} 不同且共享邊或角)
C_1 位於 (0, 0)(即,值爲 grid[0][0])
C_k 位於 (N-1, N-1)(即,值爲 grid[N-1][N-1])
如果 C_i 位於 (r, c),則 grid[r][c] 爲空(即,grid[r][c] == 0)
返回這條從左上角到右下角的最短暢通路徑的長度。如果不存在這樣的路徑,返回 -1 。
在這裏插入圖片描述
在這裏插入圖片描述
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/shortest-path-in-binary-matrix
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

解決思路

尋找最短距離,一般都是用bfs算法解決,今天時間有限,就不分析圖的原理了,當前直接上代碼。

struct node
{
    int x, y, d;
    node(int a, int b, int c)
    {
        x = a;     // 當前x座標
        y = b;     // 當前y座標
        d = c;     // 當前走了多少步
    }	
};
int shortestPathBinaryMatrix(vector<vector<int>>& grid) 
 {
        int len = grid.size();
        // 頭尾不通直接不通
        if (len == 0 || grid[0][0] == 1 || grid[len - 1][len - 1] == 1) 
            return -1;
        // 隊列存儲圖內容
        queue<node> matrix;
        node first(0, 0, 1);
        int dx[] = { -1, -1, -1, 0, 1, 1,  1,  0};
        int dy[] = { -1,  0,  1, 1, 1, 0, -1, -1};


        matrix.push(first);
        while(!matrix.empty())
        {
            node value = matrix.front();
            matrix.pop();
            // 因爲圖的關係是一層一層展開,那麼最先到達終點的一定是最短距離
            if ((value.x == len - 1) && (value.y == len -1))
                return value.d;
			
			// 尋找目標節點周圍所有可行的節點
            for (int i = 0; i < 8; i++)
            {
                int nx = value.x+dx[i];
                int ny = value.y+dy[i];
                if (nx >= 0 && nx < len && ny >= 0 && ny <len && grid[nx][ny] == 0)
                {
                	// 已經走過的通路節點進行標記
                    grid[nx][ny] = 1;
                    // 路徑加1
                    matrix.push(node(nx, ny, value.d+1));
                }
            }
        }
        return -1;
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章