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