100 lines
2.2 KiB
C
100 lines
2.2 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
|
|
#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);
|
|
}
|