为什么要把这道题归类为简单???(黑人问号)果然还是我太菜了
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
// 1.坏橘子入队列
//2.4个方向判断,符合条件的好橘子变坏,并将变坏的橘子入队列(BFS)
//3.判断队列空后是否还有好橘子,若有则返回-1,否则返回分钟数lev
//创建队列结构
typedef struct
{
int x;
int y;
int lev;
}Queue;
int orangesRotting(int** grid, int gridSize, int* gridColSize){
int m = gridSize;
int n = gridColSize[0];
int i, j;
int lev = 0;
int rear = 0;
int front = 0;
int x, y, xx, yy;
int x_shift[] = {-1, 1, 0, 0};
int y_shift[] = {0, 0, -1, 1};
Queue *Q = (Queue*)malloc(sizeof(Queue) * m * n);
// 1.坏橘子入队列
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
if(grid[i][j] == 2)
{
//入队列
Q[rear].x = i;
Q[rear].y = j;
Q[rear++].lev = 0;
}
}
}
//BFS遍历,判断4个方向的橘子状态,把好橘子变坏
while(front != rear)
{
x = Q[front].x;
y = Q[front].y;
lev = Q[front++].lev;
//4个方向判断
for(i = 0; i < 4; i++)
{
xx = x + x_shift[i];
yy = y + y_shift[i];
if(xx < 0 || xx >= m || yy < 0 || yy >= n || grid[xx][yy] != 1)
continue;
grid[xx][yy] = 2;
Q[rear].x = xx;
Q[rear].y = yy;
Q[rear++].lev = lev + 1;
}
}
//判断是否还有好橘子
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
if(grid[i][j] == 1)
return -1;
}
}
return lev;
}