#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); }