人是會成長的生物。
終於我也從不會寫BFS和DFS,變成一個沒有感情的遍歷矩陣機器
多源廣度優先搜索
num
表示橘子數(腐爛+新鮮)。
用size=que.size();
限制同一層次(分鐘)的腐爛橘子,用於控制時間
最後一層的橙子已經腐爛完畢,遍歷它的四周也沒有增長,故minute-1
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
vector<int> dx={-1,1,0,0};
vector<int> dy={0,0,-1,1};
queue<vector<int>> que;
int minute=0,num=0;
int x,y;
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[i].size();j++)
{
if(grid[i][j]!=0)
num++;
if(grid[i][j]==2)
que.push({i,j});
}
}
if(num==0) return 0;
while(!que.empty())
{
int size=que.size();
for(int i=0;i<size;i++)
{
vector<int> tmp=que.front();
que.pop();
num--;
for(int k=0;k<4;k++)
{
x=tmp[0]+dx[k];
y=tmp[1]+dy[k];
if(x>=0&&x<grid.size()&&y>=0&&y<grid[0].size()&&grid[x][y]==1)
{
grid[x][y]=2;
que.push({x,y});
}
}
}
minute++;
}
return num==0?minute-1:-1;
}
};
附錄:多源bfs框架
多源BFS框架(學習鏈接)
level = 0
while queue 不空:
size = queue.size()
while (size --) {
cur = queue.pop()
for 節點 in cur的所有相鄰節點:
if 該節點有效且未被訪問過:
queue.push(該節點)
}
level ++;