aocc23

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

common.c (876B)


      1 #include "common.h"
      2 
      3 size_t idx(size_t row, size_t col, size_t ncols) { return row * ncols + col; }
      4 
      5 int walkable(char **lines, size_t r, size_t c) {
      6   return lines[r][c] == '.' || lines[r][c] == '<' || lines[r][c] == '>' ||
      7          lines[r][c] == '^' || lines[r][c] == 'v';
      8 }
      9 
     10 /**
     11  * This is a terrible solution, essentially
     12  * brute force, recursively. Could replace with
     13  * dyn.prog.
     14  */
     15 void recursive_longest_path(uint8_t *visited, size_t node, size_t end,
     16                             size_t steps, const dg_t *g, size_t *l) {
     17   size_t i;
     18   visited[node] = 1;
     19 
     20   if (node == end) {
     21     if (*l < steps) {
     22       *l = steps;
     23     }
     24   } else {
     25     for (i = 0; i < g->nbrs[node].nmemb; i++) {
     26       size_t nbr = g->nbrs[node].data[i];
     27       if (visited[nbr] == 0) {
     28         recursive_longest_path(visited, nbr, end, steps + 1, g, l);
     29       }
     30     }
     31   }
     32 
     33   visited[node] = 0;
     34 }