commit 7fd372e83bd54861fc4e26e8cc1ebba8b9f427ba
parent b609d1484f17b56f2fb95e74019e25be48948f9c
Author: bsandro <email@bsandro.tech>
Date: Thu, 11 Dec 2025 09:01:14 +0200
day11 p1
Diffstat:
| A | day11.c | | | 94 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 94 insertions(+), 0 deletions(-)
diff --git a/day11.c b/day11.c
@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdbool.h>
+#include "cputime.h"
+
+#define NAME_LEN 4
+#define MAX_NODES 600
+
+typedef struct Node {
+ char name[NAME_LEN];
+ int adj_l;
+ struct Node *adj[32];
+} Node;
+
+typedef struct {
+ Node nodes[MAX_NODES];
+ int cnt;
+} Nodes;
+
+Node * find(Nodes *nodes, char name[4]) {
+ Node *n = NULL;
+ for (int i=0;i<nodes->cnt;++i) {
+ if (strncmp(name, nodes->nodes[i].name, NAME_LEN-1)==0) {
+ return &nodes->nodes[i];
+ }
+ }
+ return n;
+}
+
+Node * find_or_create(Nodes *nodes, char name[4]) {
+ Node *n = find(nodes, name);
+ if (n!=NULL) return n;
+ n = &nodes->nodes[nodes->cnt++];
+ strcpy(n->name, name);
+ return n;
+}
+
+int bfs1(Nodes *nodes) {
+ int num = 0;
+ Node *start = find(nodes, "you");
+ Node *end = find(nodes, "out");
+ Node *queue[MAX_NODES] = {0};
+ int front = 0;
+ int back = 0;
+ queue[back++] = start;
+ while (front<back) {
+ Node *cur = queue[front++];
+ if (cur==end) num++;
+ for (int i=0;i<cur->adj_l;++i) {
+ queue[back++] = cur->adj[i];
+ }
+ }
+ return num;
+}
+
+int bfs2(Nodes *nodes) {
+ int num = 0;
+ Node *start = find(nodes, "you");
+ Node *end = find(nodes, "out");
+ Node *queue[MAX_NODES] = {0};
+ int front = 0;
+ int back = 0;
+ queue[back++] = start;
+ while (front<back) {
+ Node *cur = queue[front++];
+ if (cur==end) num++;
+ for (int i=0;i<cur->adj_l;++i) {
+ queue[back++] = cur->adj[i];
+ }
+ }
+ return num;
+}
+
+int main(void) {
+ char buf[NAME_LEN];
+ int buf_l = 0;
+ Nodes nodes = {0};
+ Node *node = NULL;
+ for (int c=getchar();c!=EOF;c=getchar()) {
+ if (c>='a'&&c<='z') buf[buf_l++] = c;
+ else if (c==':') {
+ node = find_or_create(&nodes, buf);
+ buf_l = 0;
+ } else if (c=='\n'||(c==' '&&buf_l>0)) {
+ node->adj[node->adj_l++] = find_or_create(&nodes, buf);
+ buf_l = 0;
+ if (c=='\n') node = NULL;
+ }
+ }
+
+ int p1 = bfs1(&nodes);
+ printf("p1: %d\n", p1);
+ return 0;
+}