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

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值