题目
题目链接
思路
利用队列进行BFS,我这里用了两种方法,
第一种方法借用了一个外部数组,用来存储节点是在第几次侵染时被染成坏橘子的,
这样当一个好橘子将被染成坏橘子时,只需要找到侵染源,然后加1就可以了,坏处是占内存,耗时;
第二种方法是先得到队列中元素的数量,就是上一次侵染所感染的总数,直接循环这么多次就可以了;
代码
typedef pair<int,int> pr;
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
int X[4] = {0,1,0,-1};
int Y[4] = {1,0,-1,0};
int status[10][10];
memset(status,0,sizeof(status));
int cnt = 0;
queue<pr> Q;
for(int i=0; i<grid.size(); i++){
for(int j=0; j<grid[0].size(); j++){
if(grid[i][j] == 2) Q.push(make_pair(i,j));
else if(grid[i][j] == 1)cnt++;
}
}
if(cnt==0) return 0;
int ans = 0;
while(!Q.empty()){
pr ele = Q.front();
Q.pop();
for(int i=0; i<4; i++){
int x = ele.first+X[i];
int y = ele.second+Y[i];
if(x>=0 && x<grid.size() && y>=0 && y<grid[0].size() && grid[x][y]==1){
grid[x][y] = 2;
cnt--;
Q.push(make_pair(x,y));
status[x][y] = status[ele.first][ele.second]+1;
if(ans < status[x][y]) ans = status[x][y];
}
}
}
return cnt>0 ? -1:ans;
}
};
typedef pair<int,int> pr;
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
int X[4] = {0,1,0,-1};
int Y[4] = {1,0,-1,0};
int cnt = 0;
queue<pr> Q;
for(int i=0; i<grid.size(); i++){
for(int j=0; j<grid[0].size(); j++){
if(grid[i][j] == 2) Q.push(make_pair(i,j));
else if(grid[i][j] == 1)cnt++;
}
}
if(cnt==0) return 0;
int ans = 0;
while(!Q.empty()){
int size = Q.size();
bool flag = false;
for(int k = 0; k<size; k++){
pr ele = Q.front();
Q.pop();
for(int i=0; i<4; i++){
int x = ele.first+X[i];
int y = ele.second+Y[i];
if(x>=0 && x<grid.size() && y>=0 && y<grid[0].size() && grid[x][y]==1){
grid[x][y] = 2;
cnt--;
Q.push(make_pair(x,y));
flag = true;
}
}
}
if(flag) ans++;
}
return cnt>0 ? -1:ans;
}
};