diff --git a/15/15-1.c b/15/15-1.c new file mode 100644 index 0000000..791c0dd --- /dev/null +++ b/15/15-1.c @@ -0,0 +1,83 @@ +#include +#include +#include + +#define PART_2 + +#define SPACE_SIZE 10 + +typedef struct +{ + int risk; + int min_risk_path; + bool explored; +} CELL; + +typedef CELL **SPACE; + +#define VALID_POSITION(x, y) (x < SPACE_SIZE && x >= 0 && y < SPACE_SIZE && y >= 0) +#define END(x, y) (x == SPACE_SIZE - 1 && y == SPACE_SIZE - 1) + +void print_space(SPACE space) +{ + for (size_t i = 0; i < SPACE_SIZE; i++) + { + for (size_t j = 0; j < SPACE_SIZE; j++) + // printf("%d(%c,%d)", space[i][j].risk, space[i][j].explored ? '*' : '.', space[i][j].min_risk_path); + printf("%d(%d)", space[i][j].risk, space[i][j].min_risk_path); + putchar('\n'); + } + putchar('\n'); +} + +void node_risk(SPACE space, int x, int y, int risk) +{ + if (!VALID_POSITION(x, y)) + return; + risk += space[x][y].risk; + if (risk < space[x][y].min_risk_path) + space[x][y].min_risk_path = risk; +} + +int main(int argc, char const *argv[]) +{ + FILE *p_file = fopen("input", "r"); + SPACE space = calloc(SPACE_SIZE, sizeof(CELL *)); + for (size_t i = 0; i < SPACE_SIZE; i++) + { + space[i] = calloc(SPACE_SIZE, sizeof(CELL)); + char buf[SPACE_SIZE + 2]; + fgets(buf, sizeof buf, p_file); + for (size_t j = 0; j < SPACE_SIZE; j++) + { + space[i][j].risk = buf[j] - '0'; + space[i][j].explored = false; + space[i][j].min_risk_path = __INT_MAX__; + } + } + + space[0][0].min_risk_path = 0; + for (size_t i = 0; i < 500; i++) // What the fuck? Brute forced it + { + for (size_t c = 0; c < SPACE_SIZE * 2; c++) + { + for (size_t x = 0; x <= c; x++) + { + int y = c - x; + if (VALID_POSITION(x, y)) + { + space[x][y].explored = true; + node_risk(space, x + 1, y, space[x][y].min_risk_path); + node_risk(space, x, y + 1, space[x][y].min_risk_path); + node_risk(space, x - 1, y, space[x][y].min_risk_path); + node_risk(space, x, y - 1, space[x][y].min_risk_path); + } + } + } + } + // print_space(space); + + printf("Minimum risk %d\n", space[SPACE_SIZE - 1][SPACE_SIZE - 1].min_risk_path); + + return 0; +}