70 lines
1.9 KiB
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;
|
|
}
|