Leetcode994. 腐烂的橘子(C语言)

Leetcode994. 腐烂的橘子(C语言)

题目:
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。例:
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4

Leetcode994. 腐烂的橘子(C语言)_第1张图片
思路:
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

你可能感兴趣的:(数据结构&算法)