994.腐烂的橘子
-
链接
leetcode
-
solution:
胡烂的橘子
有点像那个染色问题
BFS 感觉难点在于怎么判断还能不能腐烂橘子 写了一堆又臭又长的代码…
ps:学会了一个东西 就是需要取上下左右值的时候 可以写一个数组{{1,0},{-1,0},{0,1},{0,-1}}
然后先计算 再判断是否超界 比一层一层的判断之后再计算好
-
code
class Solution {
public:
//BFS!!!!!!!!!!!!!!!!!!!!!!!!!!!
int orangesRotting(vector<vector<int>>& grid) {
if(grid.size()==0||grid[0].size()==0) return -1;
queue<pair<int,int>>q;
int count=0;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]!=0) count++;
if(grid[i][j]==2)
q.push(make_pair(i,j));
}
}
int time=0;
if(count==q.size()) return 0;
vector<pair<int,int>>ms={{1,0},{-1,0},{0,1},{0,-1}};
while(!q.empty()){
int len=q.size();
time++;
while(len--){
auto t=q.front();
q.pop();
for(auto m:ms){
int x=t.first+m.first;
int y=t.second+m.second;//pair<>is a good tool
if(x<0||x>=grid.size()||y<0||y>=grid[0].size()) continue;//以后遇到这样用,就不用每次浪费if一大堆了
//pair是个好东西
if(grid[x][y]==1){
grid[x][y]=2;
q.push(make_pair(x,y));
}
}
}
}
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
//if(grid[i][j]!=0) count++;
if(grid[i][j]==1)
return -1;
}
}
return time-1;
}
};