class Solution:
def orangesRotting(self, grid: List[List[int]]) -> int:
# 分类,挑好坏橘子
m,n=len(grid),len(grid[0])
have_good=False
rot_orange=[]
for r in range(m):
for c in range(n):
if grid[r][c]==2:
rot_orange.append((r,c))
elif grid[r][c]==1:
have_good=True
if not have_good:
return 0
if not rot_orange:
return -1
minute=-1
while True:
# 记录一下,后续需要进行比较
pre_len=len(rot_orange)
for _ in range(pre_len):
x,y=rot_orange[_]
for dx in (-1,0,1):
for dy in (-1,0,1):
# 只需要四个方向,上下左右,对角线方向的去掉
if dx==0 or dy==0:
if m>x+dx>=0 and n>y+dy>=0 and grid[x+dx][y+dy]==1:
grid[x+dx][y+dy]=2
rot_orange.append((x+dx,y+dy))
minute+=1
# 长度没有变化,退出
if pre_len==len(rot_orange):
break
# 判断是否还有好橘子
for r in range(m):
for c in range(n):
if grid[r][c]==1:
return -1
return minute
C++
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid)
{
int minute=0,fresh=0;
queue<pair<int,int>> q;
int m=grid.size();
int n=grid[0].size();
for(int r=0;r<m;r++)
for(int c=0;c<n;c++)
{
if(grid[r][c]==1) fresh++;
else if(grid[r][c]==2) q.push({r,c});
}
// cout<<fresh<<endl;
// 方向
vector<pair<int,int>> dir={{-1,0},{1,0},{0,1},{0,-1}};
while(!q.empty())
{
int pre_len=q.size();
bool rot=false;
for(int _=0;_<pre_len;_++)
{
auto rot_orange=q.front();
q.pop();
for(auto d:dir)
{
int x=rot_orange.first+d.first;
int y=rot_orange.second+d.second;
if(x>=0&&x<m && y>=0&&y<n && grid[x][y]==1)
{
grid[x][y]=2;
q.push({x,y});
fresh--;
rot=true;
}
}
}
if(rot) minute++;
}
// cout<<minute<<' '<<fresh;
return fresh ? -1 : minute;
}
};