题目描述:994. 腐烂的橘子 - 力扣(LeetCode)
腐烂的橘子会污染周围的橘子,要求多少轮扩散才能把全部橘子污染,这就相当于滴墨水入清水,会扩散,其实就是广度遍历,看看遍历多少层可以遍历完可以遍历的
先遍历一次橘子,记录下腐烂橘子的位置和新鲜橘子的数目,然后广度遍历腐烂橘子并向外扩散污染新鲜橘子
注意向外扩散时需要每次取位置,因为移动会改变位置,位置需要重置
class Solution {
public:
int rows, columns;
vector<vector<int> > grid;
bool isValid(int x, int y) {
return x >= 0 && y >= 0 && x < rows && y < columns;
}
int orangesRotting(vector<vector<int> > &grid) {
rows = grid.size();
columns = grid[0].size();
this->grid = move(grid);
int ans = 0, fresh = 0;
queue<pair<int, int> > pullte;
for (int i = 0; i < rows; ++i)
for (int j = 0; j < columns; ++j)
if (this->grid[i][j] == 1)
++fresh;
else if (this->grid[i][j] == 2)
pullte.emplace(i, j);
int move[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
while (fresh > 0 && !pullte.empty()) {
int scale = pullte.size();
while (--scale >= 0) {
for (int i = 0; i < 4; ++i) {
auto [x,y] = pullte.front();
x += move[i][0];
y += move[i][1];
if (isValid(x, y) && this->grid[x][y] == 1) {
this->grid[x][y] = 2;
pullte.emplace(x, y);
--fresh;
}
}
pullte.pop();
}
++ans;
}
if (fresh > 0)
return -1;
return ans;
}
};