mgla

Advent of Code - 2025 - Day 11

Dec 11th, 2025
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.91 KB | None | 0 0
  1. var input = await File.ReadAllLinesAsync("input.txt");
  2.  
  3. var graph = new Dictionary<string, string[]>();
  4. var start = "you";
  5. const string end = "out";
  6.  
  7. foreach (var line in input)
  8. {
  9.     var parts = line.Split(": ");
  10.     var node = parts[0];
  11.     var edges = parts[1].Split(" ");
  12.     graph[node] = edges;
  13. }
  14.  
  15. var part1 = CountPaths(start, end, graph);
  16.  
  17. Console.WriteLine($"Part 1: {part1}");
  18.  
  19. start = "svr";
  20. const string fft = "fft";
  21. const string dac = "dac";
  22.  
  23. var startToFft = CountPaths(start, fft, graph);
  24. var fftToDac = CountPaths(fft, dac, graph);
  25. var dacToEnd = CountPaths(dac, end, graph);
  26.  
  27. var part2 = startToFft * fftToDac * dacToEnd;
  28.  
  29. Console.WriteLine($"Part 2: {part2}");
  30.  
  31. return;
  32.  
  33. static long CountPaths(string start, string end, Dictionary<string, string[]> graph)
  34. {
  35.     var memo = new Dictionary<string, long>();
  36.     var stack = new Stack<string>();
  37.     stack.Push(start);
  38.  
  39.     while (stack.Count > 0)
  40.     {
  41.         var current = stack.Peek();
  42.  
  43.         if (memo.ContainsKey(current))
  44.         {
  45.             stack.Pop();
  46.             continue;
  47.         }
  48.  
  49.         if (current == end)
  50.         {
  51.             memo[current] = 1;
  52.             stack.Pop();
  53.             continue;
  54.         }
  55.  
  56.         if (!graph.TryGetValue(current, out var neighbors))
  57.         {
  58.             memo[current] = 0;
  59.             stack.Pop();
  60.             continue;
  61.         }
  62.  
  63.         var allNeighborsProcessed = true;
  64.         foreach (var neighbor in neighbors.Where(n => !memo.ContainsKey(n)))
  65.         {
  66.             stack.Push(neighbor);
  67.             allNeighborsProcessed = false;
  68.         }
  69.  
  70.         if (allNeighborsProcessed)
  71.         {
  72.             long count = 0;
  73.             foreach (var neighbor in neighbors)
  74.             {
  75.                 count += memo[neighbor];
  76.             }
  77.             memo[current] = count;
  78.             stack.Pop();
  79.         }
  80.     }
  81.  
  82.     return memo.GetValueOrDefault(start, 0);
  83. }
Advertisement
Add Comment
Please, Sign In to add comment