diff --git a/c/2024/18/ram_run.c b/c/2024/18/ram_run.c new file mode 100644 index 0000000..abcd7ab --- /dev/null +++ b/c/2024/18/ram_run.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include + +#include "../../lib/aoc.h" + +#define DIMENSION 71 +#define QUEUE_LENGTH 200 + +typedef struct Node { + int x; + int y; + char c; + int cost; +} Node; + +typedef struct Grid { + Node grid[DIMENSION][DIMENSION]; +} Grid; + +int main() { + char *line; + Grid g; + + for (int i = 0; i < DIMENSION; i++) { + for (int j = 0; j < DIMENSION; j++) { + g.grid[i][j].x = i; + g.grid[i][j].y = j; + g.grid[i][j].c = '.'; + g.grid[i][j].cost = -1; + } + } + + int x, y; + int i = 0; + + while ((line = aoc_read_line()) != NULL) { + sscanf(line, "%d,%d", &x, &y); + if (i++ < 1024) g.grid[x][y].c = '#'; + } + + Node* queue[QUEUE_LENGTH]; + queue[0] = &(g.grid[0][0]); + int queue_start = 0; + int queue_end = 1; + + g.grid[0][0].c = '*'; + g.grid[0][0].cost = 0; + + while (queue_start != queue_end) { + // get first element of queue + Node* n = queue[queue_start++]; + queue_start %= QUEUE_LENGTH; + n->c = ' '; + // add its neighbors to the queue + if (n->x - 1 >= 0 && g.grid[n->x - 1][n->y].c == '.') { + g.grid[n->x - 1][n->y].c = '*'; + g.grid[n->x - 1][n->y].cost = n->cost + 1; + queue[queue_end++] = &(g.grid[n->x - 1][n->y]); + queue_end %= 200; + } + + if (n->y - 1 >= 0 && g.grid[n->x][n->y - 1].c == '.') { + g.grid[n->x][n->y - 1].c = '*'; + g.grid[n->x][n->y - 1].cost = n->cost + 1; + queue[queue_end++] = &(g.grid[n->x][n->y - 1]); + queue_end %= 200; + } + + if (n->x + 1 < DIMENSION && g.grid[n->x + 1][n->y].c == '.') { + g.grid[n->x + 1][n->y].c = '*'; + g.grid[n->x + 1][n->y].cost = n->cost + 1; + queue[queue_end++] = &(g.grid[n->x + 1][n->y]); + queue_end %= 200; + } + + if (n->y + 1 < DIMENSION && g.grid[n->x][n->y + 1].c == '.') { + g.grid[n->x][n->y + 1].c = '*'; + g.grid[n->x][n->y + 1].cost = n->cost + 1; + queue[queue_end++] = &(g.grid[n->x][n->y + 1]); + queue_end %= 200; + } + } + + /* + for (int i = 0; i < DIMENSION; i++) { + for (int j = 0; j < DIMENSION; j++) { + printf("%c", g.grid[j][i].c); + } + printf("\n"); + } + */ + + printf("Part 1: %d", g.grid[DIMENSION - 1][DIMENSION - 1].cost); + + aoc_free(); + exit(0); +}