hot100:腐烂的橘子
多源广度优先搜索,代码很烂但是能跑
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
vector<pair<int, int>> que;
int fresh = 0;
int res = 0;
// 统计烂橘子位置和橘子数量
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
if (grid[i][j] == 2) {
que.push_back(make_pair(i, j));
}
if (grid[i][j] == 1) {
fresh++;
}
}
}
while (1) {
if (fresh == 0)
return res;
int ori_fresh = fresh;
// que中的每个橘子都向四周感染一次
int sum = que.size();
for (int i = 0; sum > 0; i++) {
sum--;
int x = que[0].first;
int y = que[0].second;
if (x > 0 && grid[x - 1][y] == 1) {
que.push_back(make_pair(x - 1, y));
grid[x - 1][y] = 2;
fresh--;
}
if (y > 0 && grid[x][y - 1] == 1) {
que.push_back(make_pair(x, y - 1));
grid[x][y - 1] = 2;
fresh--;
}
if (x < grid.size() - 1 && grid[x + 1][y] == 1) {
que.push_back(make_pair(x + 1, y));
grid[x + 1][y] = 2;
fresh--;
}
if (y < grid[0].size() - 1 && grid[x][y + 1] == 1) {
que.push_back(make_pair(x, y + 1));
grid[x][y + 1] = 2;
fresh--;
}
que.erase(que.begin());
}
// 每次循环代表一分钟,如果fresh数量不变,则说明无法感染
res++;
if (ori_fresh == fresh) {
return -1;
}
}
}
};