首先保存一下所有的新鲜橘子,然后在把腐烂的橘子放入队列,定义四个坐标,当队列不为空
的时候,(遍历四个方向即可)就把当前橘子的四周橘子置为腐烂(2),然后把置为腐烂的橘子加入队列
此题和200题类似
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
int fresh = 0;
queue<pair<int, int>> q;
int num = 0;
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
if (grid[i][j] == 1) {
fresh++;
}
if (grid[i][j] == 2) {
q.push({i, j});
}
}
}
vector<vector<int>> dirs = {
{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; // 上下左右四个方向
while (!q.empty() && fresh > 0) {
int q_len = q.size();
for (int i = 0; i < q_len; i++) {
// 拿出第一个
auto tmp = q.front();
q.pop();
for (int i = 0; i < dirs.size(); i++) {
int tmp_row = tmp.first + dirs[i][0];
int tmp_col = tmp.second + dirs[i][1];
// 判断边界条件,不是新鲜橘子就走,注意||的短路性质
//所以需要首先判断边界条件,再最后判断取值是否满足
if (tmp_col < 0 || tmp_row < 0|| tmp_row >= grid.size() ||
tmp_col >= grid[0].size() ||
grid[tmp_row][tmp_col] != 1 ) {
continue;
}
// 表示为好橘子
grid[tmp_row][tmp_col] = 2;
fresh--;
q.push({tmp_row, tmp_col});
}
}
num++;
}
if (fresh)
return -1;
else
return num;
}
};
207

被折叠的 条评论
为什么被折叠?



