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 }