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