输入:只包含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 };
时间: 2024-08-09 23:43:11