Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. class Solution {
  2. private:
  3. int n, m;
  4. int INF = INT_MAX;
  5. vector<vector<int>> ans;
  6. vector<pair<int, int>> dirs = { {-1,0}, {1,0}, {0,-1}, {0,1} };
  7. vector<bool> vis;
  8. public:
  9. vector<vector<int>> updateMatrix(const vector<vector<int>>& matrix) {
  10. n = matrix.size();
  11. if(n != 0) m = matrix[0].size();
  12.  
  13. ans.assign(n, vector<int>(m, INF));
  14. vis.assign(n*m, false);
  15.  
  16. int i, j, i_, j_;
  17. queue<pair<int, int>> Q;
  18. for(i=0; i<n; ++i) for(j=0; j<m; ++j) {
  19. if(matrix[i][j] == 1) continue;
  20.  
  21. ans[i][j] = 0;
  22. vis[i*m+j] = true;
  23.  
  24. for(auto &d:dirs) {
  25. i_ = i + d.first;
  26. j_ = j + d.second;
  27.  
  28. if(i_ < 0 || i_ >= n || j_ < 0 || j_ >= m || matrix[i_][j_] == 0 || vis[i_*m+j_]) continue;
  29. Q.push( {i_*m+j_, 1} );
  30. vis[i_*m+j_] = true;
  31. ans[i_][j_] = 1;
  32. }
  33.  
  34. }
  35.  
  36.  
  37. while(!Q.empty()) {
  38. int x = Q.front().first;
  39. i = x/m;
  40. j = x%m;
  41. int dist = Q.front().second;
  42. Q.pop();
  43.  
  44. for(auto &d:dirs) {
  45. i_ = i + d.first;
  46. j_ = j + d.second;
  47. if(i_ < 0 || i_ >= n || j_ < 0 || j_ >= m || vis[i_*m+j_]) continue;
  48.  
  49. Q.push( {i_*m+j_, dist+1} );
  50. vis[i_*m+j_] = true;
  51. ans[i_][j_] = dist+1;
  52. }
  53. }
  54.  
  55. return ans;
  56. }
  57. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement