人是会成长的生物。
终于我也从不会写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 ++;