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));
        }
Exemple #2
0
        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
        }