LeetCode //C - 994. Rotting Oranges

994. Rotting Oranges

You are given an m x n grid where each cell can have one of three values:

  • 0 representing an empty cell,
  • 1 representing a fresh orange, or
  • 2 representing a rotten orange.

Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.

Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1.

Example 1:

Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4

Example 2:

Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.

Example 3:

Input: grid = [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.

Constraints:
  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • grid[i][j] is 0, 1, or 2.

From: LeetCode

Link: 994. Rotting Oranges


Solution:

Ideas:

The function counts the number of fresh oranges and enqueues the positions of the rotten oranges. It then uses BFS to iterate through the grid, rotting adjacent fresh oranges each minute. If there are no fresh oranges left, it returns the number of minutes that have passed. If there are still fresh oranges that cannot be reached, it returns -1.

Code:
c 复制代码
int orangesRotting(int** grid, int gridSize, int* gridColSize) {
    int fresh = 0;
    int minutes = 0;
    int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    int currentSize, i, j, k, x, y;
    
    // Count fresh oranges and enqueue rotten oranges' positions
    int queueSize = gridSize * (*gridColSize);
    int **queue = malloc(queueSize * sizeof(int*));
    for (i = 0; i < queueSize; i++) {
        queue[i] = malloc(2 * sizeof(int));
    }
    int front = 0, rear = 0;
    
    for (i = 0; i < gridSize; i++) {
        for (j = 0; j < gridColSize[i]; j++) {
            if (grid[i][j] == 1) {
                fresh++;
            } else if (grid[i][j] == 2) {
                queue[rear][0] = i;
                queue[rear][1] = j;
                rear++;
            }
        }
    }
    
    // BFS from rotten oranges
    while (fresh > 0 && front < rear) {
        currentSize = rear - front; // Number of oranges to rot this minute
        for (k = 0; k < currentSize; k++) {
            int *point = queue[front++];
            for (i = 0; i < 4; i++) {
                x = point[0] + directions[i][0];
                y = point[1] + directions[i][1];
                if (x >= 0 && y >= 0 && x < gridSize && y < gridColSize[x] && grid[x][y] == 1) {
                    grid[x][y] = 2;
                    queue[rear][0] = x;
                    queue[rear][1] = y;
                    rear++;
                    fresh--;
                }
            }
        }
        minutes++;
    }
    
    // Free memory
    for (i = 0; i < queueSize; i++) {
        free(queue[i]);
    }
    free(queue);
    
    return fresh == 0 ? minutes : -1;
}
相关推荐
电鱼智能的电小鱼24 分钟前
基于电鱼 AI 工控机的智慧工地视频智能分析方案——边缘端AI检测,实现无人值守下的实时安全预警
网络·人工智能·嵌入式硬件·算法·安全·音视频
孫治AllenSun1 小时前
【算法】图相关算法和递归
windows·python·算法
格图素书2 小时前
数学建模算法案例精讲500篇-【数学建模】DBSCAN聚类算法
算法·数据挖掘·聚类
yuuki2332332 小时前
【数据结构】用顺序表实现通讯录
c语言·数据结构·后端
DashVector3 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
AI纪元故事会3 小时前
【计算机视觉目标检测算法对比:R-CNN、YOLO与SSD全面解析】
人工智能·算法·目标检测·计算机视觉
夏鹏今天学习了吗3 小时前
【LeetCode热题100(59/100)】分割回文串
算法·leetcode·深度优先
卡提西亚3 小时前
C++笔记-10-循环语句
c++·笔记·算法
还是码字踏实3 小时前
基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)
数据结构·算法·leetcode·双指针·对撞指针
ad钙奶长高高3 小时前
【C语言】扫雷游戏详解
c语言