aocc23

Advent of Code 2023
git clone git://www.tkruger.se/aocc23.git
Log | Files | Refs | README

uppgb.c (1440B)


      1 #include "common.h"
      2 
      3 static inline void edge_adder(dg_t *g, char **lines, size_t nlines,
      4                               size_t ncols, size_t row, size_t col) {
      5   //  char c = lines[row][col];
      6   // north
      7   if (row > 0 && walkable(lines, row - 1, col)) {
      8     dg_add_edge(g, idx(row, col, ncols), idx(row - 1, col, ncols));
      9   }
     10 
     11   // east
     12   if (col < ncols - 1 && walkable(lines, row, col + 1)) {
     13     dg_add_edge(g, idx(row, col, ncols), idx(row, col + 1, ncols));
     14   }
     15 
     16   // south
     17   if (row < nlines - 1 && walkable(lines, row + 1, col)) {
     18     dg_add_edge(g, idx(row, col, ncols), idx(row + 1, col, ncols));
     19   }
     20 
     21   // west
     22   if (col > 0 && walkable(lines, row, col - 1)) {
     23     dg_add_edge(g, idx(row, col, ncols), idx(row, col - 1, ncols));
     24   }
     25 }
     26 
     27 static void read_grid(dg_t *g, char **lines, size_t nlines) {
     28   size_t i, j;
     29   size_t ncols = strlen(lines[0]) - 1;
     30 
     31   dg_init(g, nlines * ncols);
     32   for (i = 0; i < nlines; i++) {
     33     for (j = 0; j < ncols; j++) {
     34       if (lines[i][j] == '.' || lines[i][j] == '>' || lines[i][j] == '<' ||
     35           lines[i][j] == 'v' || lines[i][j] == '^')
     36         edge_adder(g, lines, nlines, ncols, i, j);
     37     }
     38   }
     39 }
     40 
     41 int main(int argc, char **argv) {
     42   char **lines;
     43   size_t nlines = readlines(&lines, "input");
     44 
     45   dg_t g;
     46   read_grid(&g, lines, nlines);
     47 
     48   size_t l = 0;
     49   uint8_t visited[g.n];
     50   memset(visited, 0, g.n);
     51   recursive_longest_path(visited, 1, g.n - 2, 0, &g, &l);
     52 
     53   printf("%zu\n", l);
     54 }