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

更新于: 2020-11-16

175 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告