Leetcode994. 腐烂的橘子(C语言)
题目:
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。例:
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
思路:
bfs;队列存储烂掉的橘子,每分钟更新;最后还剩下好橘子则返回-1。
代码:
typedef struct{
int x,y,time; //横坐标,纵坐标,分钟数
}Queue;
int orangesRotting(int** grid, int gridSize, int* gridColSize){
int shiftx[]={-1,1,0,0};
int shifty[]={0,0,-1,1}; //进行上下左右正方向移动,保证x,y有序遍历
int x,y,xx,yy,time=0; //当前坐标,移动后坐标,当前分钟数
int front,rear=0; //队头队尾
Queue *q=(Queue*)malloc(sizeof(Queue)*gridSize*gridColSize[0]); //队列空间大小(注意网格横纵大小)
for(int i=0;i<gridSize;i++){ //烂橘子入队
for(int j=0;j<gridColSize[0];j++){
if(grid[i][j]==2){
q[rear].x=i;
q[rear].y=j;
q[rear++].time=0;
}
}
}
while(front!=rear){ //队列有烂橘子
x=q[front].x;
y=q[front].y;
time=q[front++].time; //从当前烂橘子开始
for(int i=0;i<4;i++){ //进行上下左右方向移动
xx=x+shiftx[i];
yy=y+shifty[i];
if(xx<0 ||xx>=gridSize ||yy<0 || yy>=gridColSize[0] ||grid[xx][yy]!=1) continue; //移动后不在网格中或者移动后不是好橘子跳出此次循环
grid[xx][yy]=2;
q[rear].x=xx;
q[rear].y=yy;
q[rear++].time=time+1; //进行状态变化
}
}
for(int i=0;i<gridSize;i++){ //判断遍历结束后是否还有好橘子
for(int j=0;j<gridColSize[0];j++){
if(grid[i][j]==1)
return -1;
}
}
return time;
}
//参考评论区linge32