題目:
在給定的 m x n 網格 grid 中,每個單元格可以有以下三個值之一:
值 0 代表空單元格;
值 1 代表新鮮橘子;
值 2 代表腐爛的橘子。
每分鐘,腐爛的橘子 周圍 4 個方向上相鄰 的新鮮橘子都會腐爛。
返回 直到單元格中沒有新鮮橘子為止所必須經過的最小分鐘數。如果不可能,返回 -1 。
C++:
//一般當一個對象有多個屬性的時候,我們會用結構體stuct寫多個屬性,而當只有兩個屬性的時候,就可以使用pair.
//pair<int, int> P; //對象P有兩個屬性,都是int類型// 思路:bfs 廣度優先搜索 首先將爛橘子坐標全放到隊列中去。進而廣度優先搜索,進行判定。可以看代碼注釋。class Solution
{
public:int badorange(vector<vector<int>>& gride){// bfs 廣度優先,將腐爛橘子的坐標放到隊列中int m = gride.size();int n = gride[0].size();queue<pair<int, int>>q; // 存放腐爛橘子的坐標bool flag = false; // 記錄是否有好橘子,若無則直接返回0int goodnums = 0;for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (gride[i][j] == 2){q.push({ i, j });}else if (gride[i][j] == 1){flag = true;goodnums++; // 好橘子的數量}}}if (!flag) return 0;int time = 0;while (!q.empty()){int qLen = q.size();flag = false; // 記錄本回合是否有好橘子變爛,若無則可直接返回,時間不進行+1for (int i = 0; i < qLen; i++){[x, y] = q.front();q.pop();// 判斷腐爛橘子的上下左右是否有新鮮橘子if (x > 0 && gride[x - 1][y] == 1){flag = true;gride[x - 1][y] = 2; // 新鮮橘子變爛goodnums--; // 新鮮橘子-1q.push({ x - 1, y }); // 新的爛橘子坐標}if (x < m - 1 && gride[x + 1][y] == 1){flag = true;gride[x + 1][y] = 2;goodnums--;q.push({ x + 1, y });}if (y > 0 && gride[x][y - 1] == 1){flage = true;gride[x][y - 1] = 2;goodnums--;q.push({ x, y - 1 });}if (y < n - 1 && gride[x][y - 1] == 1){flage = true;gride[x][y - 1] = 2;goodnums--;q.push({ x, y - 1 });}}if (flag = true){time++;}elsebreak; // 本回合無新鮮橘子變爛,直接返回}if (goodnums == 0){return time;}elsereturn -1;}
};
python:
思路:
# 1、先遍歷一次數組獲取腐爛橘子的位置,以及新鮮橘子的位置分別存在mold和fresh中
# 2、此時若沒有mold且沒有fresh則證明為空,返回0;若僅沒有mold則證明永遠不會腐爛,返回-1
# 3、接著遍歷mold中的所有坐標,check他們的上下左右,如果在fresh中則該坐標需要從fresh中取出,并且加入mold。
# 4、一輪遍歷完成讓count++,如果mold此時為空則可以停止,mold中仍有坐標則循環3中的遍歷
# 5、返回時檢查fresh,如果fresh為空則說明所有橘子已經腐爛,返回count值即可,仍有fresh說明永遠有橘子無法腐爛class Solution:def orangesRotting(self, grid):maxi = len(grid)maxj = len(grid[0])count = -1mold = []tmp = []fresh = set()# 遍歷grid獲取新鮮橘子坐標fresh,腐爛坐標moldfor i in range(maxi):for j in range(maxj):if grid[i][j] == 1:fresh.add((i,j))elif grid[i][j] == 2:mold.append([i,j])# 此時若沒有mold且沒有fresh則證明為空,返回0;若僅沒有mold則證明永遠不會腐爛,返回-1if not mold and not fresh: return 0if not mold: return -1# 腐爛橘子的函數def check(i, j):if (i,j) in fresh:fresh.remove((i,j))tmp.append((i,j))# 每輪循環檢查mold中坐標的上下左右是否可以腐爛while mold != []:for x in mold:check(x[0]-1,x[1])check(x[0]+1,x[1])check(x[0],x[1]-1)check(x[0],x[1]+1)mold = tmptmp = []count += 1# 如果fresh為空則說明所有橘子已經腐爛,返回count值即可,仍有fresh說明永遠有橘子無法腐爛if len(fresh) == 0:return countelse: return -1