private static void AddEdge(ConcreteGraph graph, Id <ConcreteNode> nodeId, int x, int y, int width, int height, bool isDiag = false) { if (y < 0 || y >= height || x < 0 || x >= width) { return; } var targetNode = GetNodeByPos(graph, x, y, width); var cost = targetNode.Info.Cost; cost = isDiag ? (cost * 34) / 24 : cost; graph.AddEdge(nodeId, targetNode.NodeId, new ConcreteEdgeInfo(cost)); }
static void Main(string[] args) { IEnumerable <Bag> rules = File.ReadLines("../../../input.txt") .Select(Bag.Parse); ConcreteGraph <string> contains = new ConcreteGraph <string>(); foreach (Bag bag in rules) { foreach (string content in bag.Contents) { contains.AddEdge(bag.Colour, content); } } ConcreteGraph <string> containedIn = contains.ReverseGraph(); int possibilities = 0; containedIn.BfsFrom("shiny gold", (container, _) => possibilities++); Console.WriteLine(possibilities - 1); // "shiny gold" alone is included in the count from BFS }