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