程式語言 - LeetCode - C - 994. Rotting Oranges



題目:


解答:

#define MAX_SIZE 10000
 
int orangesRotting(int **grid, int gridSize, int *gridColSize)
{
    int r = 0;
    int i = 0;
    int j = 0;
    int st = 0;
    int ep = 0;
    int **q = NULL;
 
    q = calloc(MAX_SIZE, sizeof(int *));
    for (i = 0; i < MAX_SIZE; i++) {
        q[i] = calloc(2, sizeof(int) * 2);
    }
 
    st = 0;
    for (i = 0; i < gridSize; i++) {
        for (j = 0; j < gridColSize[i]; j++) {
            if (grid[i][j] == 2) {
                q[ep][0] = i;
                q[ep][1] = j;
                ep += 1;
            }
        }
    }
 
    while ((ep - st) > 0) {
        int row = 0;
        int col = 0;
        int len = ep;
        int valid = 0;
        int dir[] = { -1, 0, 1, 0, -1 };
 
        for (i = 0; i < len ; i++) {
            for (j = 0; j < 4; j++) {
                col = q[i][0] + dir[j];
                row = q[i][1] + dir[j + 1];
 
                if ((row < 0) || (col < 0) || (row >= gridColSize[0]) || (col >= gridSize)) {
                    continue;
                }
 
                if (grid[col][row] == 1) {
                    q[ep][0] = col;
                    q[ep][1] = row;
                    ep += 1;
 
                    grid[col][row] = 2;
                    valid = 1;
                }
            }
        }
        st += 1;
        r += valid;
    }
 
    for (i = 0; i < gridSize; i++) {
        for (j = 0; j < gridColSize[i]; j++) {
            if (grid[i][j] == 1) {
                return -1;
            }
        }
    }
 
    return r;
}