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); } }