commit 5820e9bd6310906b5f21b897da3182a893762a7c
parent 164d5e2fa652b528c8f0de1b41f4520a80bf620b
Author: bsandro <email@bsandro.tech>
Date: Fri, 12 Dec 2025 00:55:31 +0200
day11 p2 works properly
Diffstat:
| M | day11.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