Beispiel #1
0
    static void Main(string[] args)
    {
        string[] inputs;
        inputs = Console.ReadLine().Split(' ');
        int nodeNumber = int.Parse(inputs[0]); // the total number of nodes in the level, including the gateways
        int linksNumber = int.Parse(inputs[1]); // the number of links
        int gatewayNumbers = int.Parse(inputs[2]); // the number of exit gateways

        var graph = new Graph(nodeNumber);
        for (int i = 0; i < linksNumber; i++)
        {
            inputs = Console.ReadLine().Split(' ');
            int nodeNumber1 = int.Parse(inputs[0]); // N1 and N2 defines a link between these nodes
            int nodeNumber2 = int.Parse(inputs[1]);

            graph.AddLink(nodeNumber1, nodeNumber2);
            Console.Error.Write(nodeNumber1 + "  " + nodeNumber2 + " | ");
        }

        for (int i = 0; i < gatewayNumbers; i++)
        {
            int eI = int.Parse(Console.ReadLine()); // the index of a gateway node
            graph.gatewayNumbers.Add(eI);
            Console.Error.Write(eI + " | ");
        }
        Console.Error.WriteLine("node numbers :{0} | Gateway number :{1}", graph.nodes.Count, graph.gatewayNumbers.Count);
        var path = new int[] {0, 1};
        // game loop
        while (true)
        {
            int sI = int.Parse(Console.ReadLine()); // The index of the node on which the Skynet agent is positioned this turn

            var minPathLengthArray = graph.GetNodePathLengthArray(sI);
            var nearestGatewayNumber = -1;

            foreach (var gatewayNumber in graph.gatewayNumbers)
            {
                var exitNodeNumber = graph.GetNodeIndex(gatewayNumber);

                Console.Error.WriteLine("miPathLEngthArray : {0}", minPathLengthArray[exitNodeNumber]);
                if (minPathLengthArray[exitNodeNumber] == -1)
                    continue;

                if (nearestGatewayNumber == -1)
                {
                    nearestGatewayNumber = gatewayNumber;
                }
                else
                {
                    var minExitNodeIndex = graph.GetNodeIndex(nearestGatewayNumber);
                    if (minPathLengthArray[exitNodeNumber] < minPathLengthArray[minExitNodeIndex])
                        nearestGatewayNumber = gatewayNumber;
                }
            }
            Console.Error.WriteLine("agent Node: {0} | nearestGateway number: {1} | minPathLength : {2}", sI, nearestGatewayNumber, minPathLengthArray[graph.GetNodeIndex(nearestGatewayNumber)] + 1);
            path = graph.GetShortestPath(sI, nearestGatewayNumber, minPathLengthArray[graph.GetNodeIndex(nearestGatewayNumber)] + 1);
            Console.Error.WriteLine("Number of nodes in path:{0} | agentIndex: {1} | path[0]: {2}", path.Count(), sI, path[0]);
            graph.RemoveLink(path[0], path[1]);

            Console.WriteLine("{0} {1}", path[0], path[1]); // Example: 0 1 are the indices of the nodes you wish to sever the link between
        }
    }