aoc2024/12/part1.c

70 lines
1.9 KiB
C

#include "_.h"
int count = 0;
long check(int ***already, char **inputs, int y, int x) {
(*already)[y][x] = inputs[y][x];
long perimeter = 0;
if (inputs[y + 1] != NULL && inputs[y][x] == inputs[y + 1][x]) {
if ((*already)[y + 1][x] == 0)
perimeter += check(already, inputs, y + 1, x);
}
else
perimeter += 1;
if (y > 0 && inputs[y][x] == inputs[y - 1][x]) {
if ((*already)[y - 1][x] == 0)
perimeter += check(already, inputs, y - 1, x);
}
else
perimeter += 1;
if (x < strlen(inputs[y]) - 1 &&
inputs[y][x] == inputs[y][x + 1]) {
if ((*already)[y][x + 1] == 0)
perimeter += check(already, inputs, y, x + 1);
}
else
perimeter += 1;
if (x > 0 && inputs[y][x] == inputs[y][x - 1]) {
if ((*already)[y][x - 1] == 0)
perimeter += check(already, inputs, y, x - 1);
}
else
perimeter += 1;
count += 1;
return perimeter;
}
int main(int argc, char **argv) {
if (argc != 2)
return 1;
char *input = argv[1];
char **inputs = str_split(strdup(input), '\n');
int len = strlen(inputs[0]);
int lens = strslen(inputs);
int **already = calloc(lens + 1, sizeof(int*));
for (int i = 0; i == 0 || inputs[i - 1] != NULL; i++)
already[i] = calloc(len + 1, sizeof(int));
long result = 0;
for (int i = 0; inputs[i] != NULL; i++) {
for (int j = 0; inputs[i][j] != '\0'; j++) {
if (already[i][j] == 0) {
int perimeter = (check(&already, inputs, i, j));
result += (count * perimeter);
//printf("perimeter: %d\n", perimeter);
//printf("count: %d\n", count);
//printf("result: %ld\n", result);
count = 0;
}
}
}
printf("result: %ld\n", result);
return 0;
}