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



題目:


解答:

#define MAX_SIZE 10000

int orangesRotting(int **grid, int gridSize, int *gridColSize)
{
    int r = 0;
    int c0 = 0;
    int c1 = 0;
    int st = 0;
    int ep = 0;
    int **q = NULL;

    q = malloc(sizeof(int *) * MAX_SIZE);
    for (c0 = 0; c0 < MAX_SIZE; c0++) {
        q[c0] = malloc(sizeof(int) * 2);
        memset(q[c0], 0, sizeof(int) * 2);
    }

    st = 0;
    for (c0 = 0; c0 < gridSize; c0++) {
        for (c1 = 0; c1 < gridColSize[c0]; c1++) {
            if (grid[c0][c1] == 2) {
                q[ep][0] = c0;
                q[ep][1] = c1;
                ep += 1;
            }
        }
    }

    while ((ep - st) > 0) {
        int x0 = 0;
        int y0 = 0;
        int c1 = 0;
        int ay[] = { -1, 1, 0, 0 };
        int ax[] = { 0, 0, -1, 1};
        int len = ep;
        int valid = 0;

        for (c0 = 0; c0 < len ; c0++) {
            for (c1 = 0; c1 < 4; c1++) {
                y0 = q[c0][0] + ay[c1];
                x0 = q[c0][1] + ax[c1];

                if ((x0 < 0) || (y0 < 0) || (x0 >= gridColSize[0]) || (y0 >= gridSize)) {
                    continue;
                }

                if (grid[y0][x0] == 1) {
                    q[ep][0] = y0;
                    q[ep][1] = x0;
                    ep += 1;

                    grid[y0][x0] = 2;
                    valid = 1;
                }
            }
        }
        st += 1;
        r += valid;
    }

    for (c0 = 0; c0 < gridSize; c0++) {
        for (c1 = 0; c1 < gridColSize[c0]; c1++) {
            if (grid[c0][c1] == 1) {
                return -1;
            }
        }
    }

    return r;
}