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
广告