994. 腐烂的橘子
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
> 代码
class Solution {
int dirt[4][2] = { {-1,0},{1,0},{0,1},{0,-1} };
public:
int orangesRotting(vector<vector<int>>& grid) {
int min = 0, fresh = 0;///fresh记录每一个新鲜的水果,min为记录层数
//队列,保存一对坐标
queue<pair<int, int>>que;
//遍历地图
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
if (grid[i][j] == 1)fresh++; //记录新鲜水果的数量
else if (grid[i][j] == 2) que.push({ i,j });//记录腐烂水果坐标
}
}
//层序遍历,while(直到没有元素)
//保存对首元素,
//遍历层的元素
//遍历层的四周元素
//如果符合就标记走过,添加到新的队列,并且水果新鲜-1
while (!que.empty()) {
int n = que.size();
bool rotten = false;
//遍历队列一层的元素
for (int i = 0; i < n; i++) {
auto x = que.front(); //保存腐烂元素的坐标
que.pop(); //出队列
for (auto cur : dirt) {
int i = x.first + cur[0]; //更新x的坐标
int j = x.second + cur[1]; //更新y的坐标
//如果遍历的坐标是新鲜的和符合要求的
if (i >= 0 && i < grid.size() && j >= 0 && j < grid[0].size() && grid[i][j] == 1) {
grid[i][j] = 2; //更新坐标
que.push({ i,j }); //加入队列
fresh--; //新鲜数量减一
rotten = true; //标记遍历完一层
}
}
}
if (rotten) min++; //遍历完一层,记录+1
}
return fresh ? -1 : min; //如果fresh为0,全完腐烂,返回min
//如果fresh不为0,表示还有新鲜的,返回-1
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理