Beispiel #1
0
        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()
            });
        }