994.腐烂的橘子
思路是多源广度优先搜索。我的做法是用一个队列(rotted)来记录腐烂的橘子的位置,已经入队的橘子的位置保存这个橘子所在的层数。
int orangesRotting(vector<vector<int>>& grid) {
int wid = grid.size();
int len = grid[0].size();//注意不要越界了
int dir_x[4] = {1,0,-1,0};
int dir_y[4] = {0,1,0,-1};//这里是用来向四个方向搜索的方向数组
queue<pair<int,int> > rotted;//收起坏掉了的橘子
int last = 0 ;//没坏掉的橘子
int pace = 0;//把橘子放了这么多天
for(int i = 0; i < wid; i ++){
for(int j = 0; j < len; j ++){
if(2 == grid[i][j]){//橘子坏了
grid[i][j] = pace;//这是第pace天坏的
rotted.push(make_pair(i,j));//坏橘子收起来
}
if(1 == grid[i][j]){
last ++;//好橘子记个数
}
}
}
while(!rotted.empty()){
pair<int,int> cur = rotted.front();
rotted.pop();//坏橘子带坏好橘子啦!
int x = cur.first;
int y = cur.second;
for(int i = 0; i < 4; i ++){//四个方向都带坏
int a = dir_x[i], b = dir_y[i];
if(x+a < wid && x+a >= 0 && y+b >= 0 && y+b < len && 1 == grid[x+a][y+b]){
if(pace >= grid[x][y]) pace = grid[x][y] - 1;//昨天的坏橘子今天带坏好橘子
grid[x+a][y+b] = pace;//因为好橘子坏橘子都是用正数表示,天数我们用负数表示
last --;//好橘子变少了
if(0 >= last) break;
rotted.push(make_pair(x+a,y+b));
}
}
}
if(last) return -1;//还有好橘子
return -pace;//记得天数是负的,这会儿要取倒数
}