-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0542.cpp
More file actions
49 lines (45 loc) · 1.81 KB
/
0542.cpp
File metadata and controls
49 lines (45 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#define INF 1000000000
class Solution {
private:
vector<pair<int,int>> findAllZeroPositions(vector<vector<int>> const &mat) {
vector<pair<int,int>> zeroPositions;
for (int i = 0; i < mat.size(); i++) {
for (int j = 0; j < mat[0].size(); j++) {
if (mat[i][j] == 0)
zeroPositions.push_back({i, j});
}
}
return zeroPositions;
}
bool isValidPosition(int i, int j, vector<vector<bool>> const &marks) {
return i >= 0 && i < marks.size() && j >= 0 && j < marks[0].size();
}
void fillDistances(vector<vector<int>> &dists, vector<vector<int>> const &mat) {
vector<vector<bool>> marks(mat.size(), vector<bool>(mat[0].size(), false));
vector<pair<int,int>> offsets = {{-1,0}, {0,1}, {1,0}, {0,-1}};
vector<pair<int,int>> zeroPositions = findAllZeroPositions(mat);
queue<pair<int,int>> q;
for (auto zeroPos : zeroPositions) {
dists[zeroPos.first][zeroPos.second] = 0;
q.push(zeroPos);
}
while (!q.empty()) {
pair<int,int> front = q.front(); q.pop();
marks[front.first][front.second] = true;
for (auto offset : offsets) {
int i = front.first + offset.first;
int j = front.second + offset.second;
if (isValidPosition(i, j, marks)) {
dists[front.first][front.second] = min(dists[front.first][front.second], dists[i][j] + 1);
if (!marks[i][j]) q.push({i, j});
}
}
}
}
public:
vector<vector<int>> updateMatrix(vector<vector<int>> &mat) {
vector<vector<int>> distances(mat.size(), vector<int>(mat[0].size(), INF));
fillDistances(distances, mat);
return distances;
}
};