leetcode/rotting-oranges-c/main.c
2024-06-27 11:30:16 +02:00

63 lines
1.6 KiB
C

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
int orangesRotting(int** grid, int gridSize, int* gridColSize) {
int *grid2 = malloc(sizeof(int) * gridSize * *gridColSize);
memcpy(grid2, *grid, sizeof(int) * gridSize * *gridColSize);
printf("%d %d\n", gridSize, *gridColSize);
for (int minutes = 0;; minutes++) {
for (int x = 0; x < gridSize; x++) {
for (int y = 0; y < *gridColSize; y++) {
printf("%d ", (*grid)[x * gridSize + y]);
if ( (*grid)[x * gridSize + y] != 2 ) continue;
for (int dx = MAX(x-1,0); dx < MIN(x+2, gridSize); dx++)
if ((*grid)[dx * gridSize + y] == 1) (grid2)[dx * gridSize + y] = 2;
for (int dy = MAX(y-1, 0); dy < MIN(y+2, *gridColSize); dy++)
if ((*grid)[x * gridSize + dy] == 1) (grid2)[x * gridSize + dy] = 2;
}
printf("\n");
}
int finished = 1;
int same = 1;
for (size_t i = 0; i < gridSize * *gridColSize; i++) {
if ((*grid)[i] == 1) finished = 0;
same &= (*grid)[i] == grid2[i];
}
if (finished) return minutes;
if (same) return -1;
int *temp = *grid;
*grid = grid2;
grid2 = temp;
memcpy(grid2, *grid, sizeof(int) * gridSize * *gridColSize);
}
return 0;
}
int main() {
int *test1 = malloc(sizeof(int) * 3 * 3);
int test[] = {2,1,1,1,1,0,0,1,1};
memcpy(test1, test, sizeof(int) * 3 * 3);
int gridColSize = 3;
int result = orangesRotting(&test1, 3, &gridColSize);
printf("is %d expeceted %d\n", result, 4);
assert(result == 4);
}