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