advent2025

Advent of Code 2025 Solutions
git clone git://bsandro.tech/advent2025
Log | Files | Refs | LICENSE

commit 5820e9bd6310906b5f21b897da3182a893762a7c
parent 164d5e2fa652b528c8f0de1b41f4520a80bf620b
Author: bsandro <email@bsandro.tech>
Date:   Fri, 12 Dec 2025 00:55:31 +0200

day11 p2 works properly

Diffstat:
Mday11.c | 51++++++++++++++++++++++++++++-----------------------
1 file changed, 28 insertions(+), 23 deletions(-)

diff --git a/day11.c b/day11.c @@ -9,6 +9,7 @@ Thing crashes pretty hard if 'svr'/'our' nodes weren't found, I don't care much. #include <strings.h> #include <stdbool.h> #include <stdlib.h> +#include <inttypes.h> #include "cputime.h" #define NAME_LEN 4 @@ -67,8 +68,8 @@ int find_or_create(Nodes *nodes, char name[4]) { int bfs(Nodes *nodes) { int num = 0; int start = find_index(nodes, "you"); - if (start==-1) return -1; int end = find_index(nodes, "out"); + if (start==-1||end==-1) return -1; int queue[MAX_NODES] = {0}; int front = 0; int back = 0; @@ -85,38 +86,42 @@ int bfs(Nodes *nodes) { return num; } -int dfs_walk(Nodes *nodes, int idx, int out, int dac, int fft) { - if (idx==out) { - for (int i=0;i<nodes->cnt;++i) if (nodes->nodes[i].visited) printf("-> %3d ",i); - printf("\n"); - if (nodes->nodes[dac].visited&&nodes->nodes[fft].visited) return 1; - else return 0; - } +int64_t dfs_walk(Nodes *nodes, int idx, int out) { Node *n = &nodes->nodes[idx]; - n->visited = true; + if (idx==out) return 1; if (n->dead) return 0; - int num = 0; + n->visited = true; + int64_t num = 0; for (int i=0;i<n->adj_l;++i) { if (nodes->nodes[n->adj[i]].visited) continue; - //if (nodes->nodes[n->adj[i]].dead) continue; - num += dfs_walk(nodes, n->adj[i], out, dac, fft); + num += dfs_walk(nodes, n->adj[i], out); } n->visited = false; - if (num==0) n->dead = true; + if (num==0) { + n->dead = true; + } return num; } -int dfs(Nodes *nodes) { +int64_t dfs(Nodes *nodes, int from, int to) { int num = 0; + for (int i=0;i<nodes->nodes[from].adj_l;++i) { + num += dfs_walk(nodes, nodes->nodes[from].adj[i], to); + } + for (int i=0;i<nodes->cnt;++i) nodes->nodes[i].dead = false; + return num; +} +// svr -> fft -> dac -> out; dac never connects to fft +int64_t part2(Nodes *nodes) { + int svr = find_index(nodes, "svr"); int out = find_index(nodes, "out"); int dac = find_index(nodes, "dac"); int fft = find_index(nodes, "fft"); - Node *start = find(nodes, "svr"); - if (start==NULL) return -1; - for (int i=0;i<start->adj_l;++i) { - num += dfs_walk(nodes, start->adj[i], out, dac, fft); - } - return num; + if (svr==-1||out==-1||dac==-1||fft==-1) return -1; + int64_t n1 = dfs(nodes, svr, fft); + int64_t n2 = dfs(nodes, fft, dac); + int64_t n3 = dfs(nodes, dac, out); + return n1*n2*n3; } int main(void) { @@ -138,8 +143,8 @@ int main(void) { } int p1 = bfs(nodes); - int p2 = dfs(nodes); - printf("p1: %d\np2: %d\n", p1, p2); + int64_t p2 = part2(nodes); + printf("p1: %d\np2: %"PRIi64"\n", p1, p2); return 0; } -// 18 +// 15380569 too low