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 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告