題目:

解答:
#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;
}