#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param grid int整型vector<vector<>>
* @return int整型
*/
int move[5]={-1,0,1,0,-1};
int rotApple(vector<vector<int> >& grid) {
// write code here
int l=0,r=0;
int n=grid.size();
int m=grid[0].size();
vector<vector<bool>>visited(n,vector<bool>(m,false));
vector<vector<int>> q(n*m,vector<int>(2));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]==2){
visited[i][j]=true;
q[r][0]=i;
q[r++][1]=j;
}
}
}
int levels=0;
while(l<r){
levels++;
int sizes=r-l;
for(int i=0,nx,ny,x,y;i<sizes;i++){
x=q[l][0];
y=q[l++][1];
for(int k=0;k<4;k++){
nx=x+move[k];
ny=y+move[k+1];
if(nx>=0&&ny>=0&&nx<n&&ny<m&&!visited[nx][ny]){
if(grid[nx][ny]==1){//如果是好苹果就感染成功,并加入队列,也来感染
visited[nx][ny]=true;
grid[nx][ny]=2;
q[r][0]=nx;
q[r++][1]=ny;
}
else if(grid[nx][ny]==0){//如果是空气就代表已经遍历过就行
visited[nx][ny]=true;
}
}
}
}
}
//做完感染后,就遍历检查是否还有好苹果
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]==1)
return -1;
}
}
return levels-1;
}
};