#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; } };