C++ 中的腐烂橙子
假设我们有一个网格,每个单元格可以有以下三个值之一:
值为 0 表示空单元格;
值为 1 表示新鲜的橙子;
值为 2 表示腐烂的橙子。
每一分钟,任何与腐烂的橙子相邻的新鲜橙子都会变成腐烂的。
我们需要找到必须经过的最短时间,直到没有单元格包含新鲜的橙子。如果不可能,则返回 -1。
因此,如果输入类似于 [[2,1,1],[1,1,0],[0,1,1]],则输出将为 4

为了解决这个问题,我们将遵循以下步骤:
minutes := 0
rowMax := 网格的行大小
colMax := 网格的列大小
freshLeft := false
newGrid := grid
当 true 为非零时,执行以下操作:
newGrid := grid
flag := false
freshLeft := false
初始化 i := 0,当 i < rowMax 时,更新(i 增加 1),执行以下操作:
初始化 j := 0,当 j < colMax 时,更新(j 增加 1),执行以下操作:
如果 newGrid[i, j] 等于 1,则:
如果 (i-1 >= 0 且 newGrid[i-1,j] 为 2) 或 (i+1 < rowMax 且 newGrid[i+1,j] 为 2) 或 (j-1 >= 0 且 newGrid[i,j-1] 为 2) 或 (j+1 >= 0 且 newGrid[i,j+1] 为 2),则
grid[i, j] := 2
flag := true
freshLeft := true
如果 flag 为非零,则:
(minutes 增加 1)
否则
退出循环
返回 (如果 freshLeft 不等于 true,则返回 minutes,否则返回 -1)
示例(C++)
让我们看看下面的实现以获得更好的理解:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int orangesRotting(vector<vector<int>> &grid) {
int minutes = 0;
int rowMax = grid.size();
int colMax = grid[0].size();
bool freshLeft = false;
auto newGrid = grid;
while (true) {
newGrid = grid;
bool flag = false;
freshLeft = false;
for (int i = 0; i < rowMax; i++) {
for (int j = 0; j < colMax; j++) {
if (newGrid[i][j] == 1) {
if ((i - 1 >= 0 && newGrid[i - 1][j] == 2) or (i + 1 < rowMax && newGrid[i + 1][j] == 2) or (j - 1 >= 0 && newGrid[i][j - 1] == 2) or (j + 1 < colMax && newGrid[i][j + 1] == 2)) {
grid[i][j] = 2;
flag = true;
}
freshLeft = true;
}
}
}
if (flag)
minutes++;
else
break;
}
return (freshLeft != true) ? minutes : -1;
}
};
main() {
Solution ob;
vector<vector<int>> v = {{2, 1, 1}, {1, 1, 0}, {0, 1, 1}};
cout << (ob.orangesRotting(v));
}输入
{{2, 1, 1}, {1, 1, 0}, {0, 1, 1}}输出
4
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP