1. 程式人生 > >LeetCode 542. 01 Matrix

LeetCode 542. 01 Matrix

lee date iostream tco ble nbsp bsp pop 輸出

輸入:只包含0,1的矩陣

輸出:元素1到達最近0的距離

算法思想:廣度優先搜索。

元素為0為可達區域,元素為1為不可達區域,我們的目標是為了從可達區域不斷地擴展至不可達區域,在擴展的過程中,也就計算出了這些不可達區域到達最近可達區域的距離。

每個可達元素都記錄了到當前位置的距離,因此在後續的遍歷中,如果是經由當前節點到達的下一節點,這個距離會被累加。

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 using namespace std;
 5 
 6 class Solution {
7 public: 8 vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) { 9 int nRow = matrix.size(); 10 int nCol = matrix[0].size(); 11 vector<vector<int>> answer(nRow, vector<int>(nCol)); 12 queue<pair<int, int
>> reachable; 13 for (int i = 0; i < nRow; i++) 14 { 15 for (int j = 0; j < nCol; j++) 16 { 17 if (matrix[i][j] == 0) // reachable 18 { 19 reachable.push(make_pair(i, j)); 20 answer[i][j] = 0
; 21 } 22 else 23 answer[i][j] = INT_MAX; 24 } 25 } 26 27 vector<pair<int, int>> dir = vector<pair<int, int>>({make_pair(-1,0),make_pair(1,0),make_pair(0,-1),make_pair(0,1)}); 28 29 while (!reachable.empty()) 30 { 31 pair<int, int> cur = reachable.front(); 32 for (int i = 0; i < 4; i++) 33 { 34 int x = dir[i].first; 35 int y = dir[i].second; 36 int cx = cur.first; 37 int cy = cur.second; 38 if (cx + x < 0 || cx + x > nRow - 1 || cy + y < 0 || cy + y > nCol - 1) // boundary test 39 continue; 40 if (matrix[cx+x][cy+y] == 1) // not visited 41 { 42 matrix[cx + x][cy + y] = 0; // label visited 43 answer[cx + x][cy + y] = answer[cx][cy] + 1; 44 reachable.push(make_pair(cx + x, cy + y)); 45 } 46 } 47 reachable.pop(); 48 } 49 return answer; 50 } 51 };

LeetCode 542. 01 Matrix