protected override ProblemOutput Solve(ProblemInput input) { Dictionary <MatrixCoordinate, ScoredCoordinate> scoreDictionary = new Dictionary <MatrixCoordinate, ScoredCoordinate>(); SortedSet <ScoredCoordinate> set = new SortedSet <ScoredCoordinate>(new Shit()); Cell[,] cells = input.Cells; int[,] cellScores = new int[cells.GetLength(0), cells.GetLength(1)]; for (int i = 0; i < cells.GetLength(0); i++) { for (int j = 0; j < cells.GetLength(1); j++) { if (cells[i, j] == Cell.Traget) { InitScoreMatrix(input, cells, cellScores, i, j); } } } for (int i = 0; i < cellScores.GetLength(0); i++) { for (int j = 0; j < cellScores.GetLength(1); j++) { var coordinate = new MatrixCoordinate(i, j); var cellScore = cellScores[i, j]; if (cellScore != 0) { var item = new ScoredCoordinate { Coordinate = coordinate, Score = cellScore }; scoreDictionary.Add(coordinate, item); set.Add(item); } } } int budget = input.StartingBudger; List <MatrixCoordinate> coordinates = CalculateRouterCoordinates(input, scoreDictionary, set, cells); int cost = 0; List <MatrixCoordinate> routerCoordinates = new List <MatrixCoordinate>(); HashSet <MatrixCoordinate> backBoneCoordinates = new HashSet <MatrixCoordinate>(); foreach (var coordinate in coordinates) { MatrixCoordinate startingBackbonePosition = input.StartingBackbonePosition; cost += input.RouterPrice; MatrixCoordinate backboneCoordinate = coordinate; List <Coordinate> coords = new List <Coordinate>(); while (!backboneCoordinate.Equals(startingBackbonePosition) && budget > cost) { if (backBoneCoordinates.Add(backboneCoordinate)) { cost += input.BackBonePrice; } backboneCoordinate = new MatrixCoordinate(backboneCoordinate.Row - Math.Sign(backboneCoordinate.Row - startingBackbonePosition.Row), backboneCoordinate.Column - Math.Sign(backboneCoordinate.Column - startingBackbonePosition.Column)); } if (cost > budget) { break; } routerCoordinates.Add(coordinate); } backBoneCoordinates.Add(input.StartingBackbonePosition); return(new ProblemOutput { BackBoneCoordinates = backBoneCoordinates.ToArray(), RouterCoordinates = routerCoordinates.ToArray() }); }