コード例 #1
0
        public void Solution(int numTestCases, int numBombs, string htmlFileFullPath, string hyperspaceFileFullPath)
        {
            if (numTestCases < 1 || numTestCases > 10 || numBombs < 3 || numBombs > 50)
            {
                return;
            }

            exampleHtmlSceneBuilder = new SceneBuilder(htmlFileFullPath);
            CreateNewHyperspace(numTestCases, numBombs, hyperspaceFileFullPath);

            bool htmlFileMade = false;

            foreach (var horrificSituation in ReadInputFile(hyperspaceFileFullPath))
            {
                //1 Make a kdtree
                tree = new KdTree <int, int>(3, new IntMath());
                foreach (var bomb in ParseTestCaseLine(horrificSituation))
                {
                    tree.Add(bomb.Item1, bomb.Item2);
                }

                //2 balance the tree once all bombs/nodes have been added
                tree.Balance();

                //3. find the most remote bomb
                var greatestNNDistance = 0;
                var mostRemoteBomb     = tree.First();

                foreach (var node in tree)
                {
                    var nodeNearestNeighbourDistance = SquaredDistanceToNearestNeighbour(node.Point);
                    if (nodeNearestNeighbourDistance > greatestNNDistance)
                    {
                        mostRemoteBomb     = node;
                        greatestNNDistance = nodeNearestNeighbourDistance;
                    }
                }

                //4. Consider the hyperrects of the remotest bomb
                var largestConnectedHyperrect = LargestConnectedHyperrect(mostRemoteBomb);
                //Let's settle for the centre of this rectangle as the safest point.
                var safestPoint = new int[] { (largestConnectedHyperrect.MaxPoint[0] + largestConnectedHyperrect.MinPoint[0]) / 2, (largestConnectedHyperrect.MaxPoint[1] + largestConnectedHyperrect.MinPoint[1]) / 2, (largestConnectedHyperrect.MaxPoint[2] + largestConnectedHyperrect.MinPoint[2]) / 2 };

                if (!htmlFileMade)
                {
                    exampleHtmlSceneBuilder.AddSafestPoint(safestPoint);
                    exampleHtmlSceneBuilder.Finish();
                    htmlFileMade = true;
                }

                //5 The requirements specicifically ask for the distance to the safest point's nearest neighbour.
                var requiredDistanceValue = SquaredDistanceToNearestNeighbour(safestPoint);
            }
        }