Exemplo n.º 1
0
        public static void Run2(bool isTest = true)
        {
            var cellPowers = PrepareInput(isTest);

            foreach (var cellPower in cellPowers)
            {
                var grid = new int[GridSize + 1, GridSize + 1];

                for (int i = 1; i <= GridSize; i++)
                {
                    for (int j = 1; j <= GridSize; j++)
                    {
                        grid[i, j] = CalculatePowerLevel(i, j, cellPower.GridSerialNumber);
                    }
                }

                var summedAreaGrid = new int[GridSize + 1, GridSize + 1];

                for (int i = 1; i <= GridSize; i++)
                {
                    for (int j = 1; j <= GridSize; j++)
                    {
                        summedAreaGrid[i, j] = grid[i, j]
                                               + summedAreaGrid[i - 1, j]
                                               + summedAreaGrid[i, j - 1]
                                               - summedAreaGrid[i - 1, j - 1];
                    }
                }

                if (true)
                {
                    PrintGridState(summedAreaGrid, (0, 0));
                }

                int maxX = 0, maxY = 0, maxSquareSize = 0;
                int totalPower = int.MinValue;

                for (int squareSize = 1; squareSize <= GridSize; squareSize++)
                {
                    for (int i = squareSize; i <= GridSize; i++)
                    {
                        for (int j = squareSize; j <= GridSize; j++)
                        {
                            int power = summedAreaGrid[i, j]
                                        + summedAreaGrid[i - squareSize, j - squareSize]
                                        - summedAreaGrid[i - squareSize, j]
                                        - summedAreaGrid[i, j - squareSize];
                            if (totalPower < power)
                            {
                                totalPower    = power;
                                maxX          = i - squareSize + 1;
                                maxY          = j - squareSize + 1;
                                maxSquareSize = squareSize;
                            }
                        }
                    }
                }

                Console.WriteLine(String.Format("GridSerialNumber {0} Max power {1} at {2},{3},{4}", cellPower.GridSerialNumber, totalPower, maxX, maxY, maxSquareSize));
                Console.ReadLine();
            }
        }
Exemplo n.º 2
0
        public static void Run1(bool isTest = true)
        {
            var cellPowers = PrepareInput(isTest);

            if (isTest)
            {
                foreach (var cellPower in cellPowers)
                {
                    int calculatedPowerLevel = CalculatePowerLevel(cellPower.X, cellPower.Y, cellPower.GridSerialNumber);
                    Console.WriteLine(String.Format("Test {0},{1} serial {2} must be {3} calculated {4}",
                                                    cellPower.X, cellPower.Y, cellPower.GridSerialNumber, cellPower.PowerLevel, calculatedPowerLevel));
                }
                Console.ReadLine();
            }
            else
            {
                foreach (var cellPower in cellPowers)
                {
                    var grid = new int[GridSize + 1, GridSize + 1];

                    for (int i = 1; i <= GridSize; i++)
                    {
                        for (int j = 1; j <= GridSize; j++)
                        {
                            grid[i, j] = CalculatePowerLevel(i, j, cellPower.GridSerialNumber);
                        }
                    }

                    var summedAreaGrid = new int[GridSize + 1, GridSize + 1];

                    for (int i = 1; i <= GridSize; i++)
                    {
                        for (int j = 1; j <= GridSize; j++)
                        {
                            summedAreaGrid[i, j] = grid[i, j]
                                                   + summedAreaGrid[i - 1, j]
                                                   + summedAreaGrid[i, j - 1]
                                                   - summedAreaGrid[i - 1, j - 1];
                        }
                    }

                    if (true)
                    {
                        PrintGridState(summedAreaGrid, (0, 0));
                    }

                    int maxX = 0, maxY = 0;
                    int totalPower = int.MinValue;
                    var powers     = new int[GridSize - 2, GridSize - 2];

                    for (int i = 3; i <= GridSize; i++)
                    {
                        for (int j = 3; j <= GridSize; j++)
                        {
                            int power = summedAreaGrid[i, j]
                                        + summedAreaGrid[i - 3, j - 3]
                                        - summedAreaGrid[i - 3, j]
                                        - summedAreaGrid[i, j - 3];
                            if (totalPower < power)
                            {
                                totalPower = power;
                                maxX       = i;
                                maxY       = j;
                            }
                        }
                    }

                    Console.WriteLine(String.Format("Max power {0} at {1},{2}", totalPower, maxX - 2, maxY - 2));
                    Console.ReadLine();
                }
            }
        }