LeetCode 542. 01 Matrix

输入:只包含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 };
原文地址:https://www.cnblogs.com/zhsuiy/p/6914581.html