读完题目感觉也就是个bfs的题。好吧 今天咳嗽咳到睡不着 直接起来做题了。。
思路:直接把最开始所有的腐烂的位置加入队列,然后bfs的时候每次取出的是腐烂的所有当前层橘子,
思路感觉一直都很清晰,就是代码挺复杂的还。
直接写代码吧:
cpp
class Solution {
typedef pair<int,int> PII;
queue<PII>q;
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
public:
int orangesRotting(vector<vector<int>>& grid) {
int ans=0;//所需分钟数
int n=grid.size();
int m=grid[0].size();
int xxjz=0;//新鲜橘子个数
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(grid[i][j]==2)
{
q.push({i,j});
}
else if(grid[i][j]==1)
{
xxjz++;
}
}
}
if(xxjz==0) return 0;//一开始就没有新鲜橘子
if(q.empty()) return -1;//没有腐烂的橘子但是有新鲜的橘子,故不可能
while(!q.empty())
{
int sz=q.size();
while(sz>0)
{
auto t=q.front();
q.pop();
sz--;
int x=t.first;
int y=t.second;
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<grid.size()&&ny>=0&&ny<grid[0].size()&&grid[nx][ny]==1)
{
q.push({nx,ny});
grid[nx][ny]=2;
xxjz--;
}
}
}
ans++; //这样写 ans 每次循环都会增加,即使这一轮并没有腐烂新的橘子。这个问题会导致最终返回的结果比实际所需的时间多1。
}
if(xxjz!=0) return -1;
return ans-1;
}
};
感觉自己写这一块已经有点那个意思了,嘻嘻。