題目說明
在一個 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;
}