public static Solution solve(PictureDescription pd) { Solution solution = new Solution(pd); //PictureDescription auxPd = new PictureDescription(pd.NumRows, pd.NumCols); for (int row = 0; row < pd.NumRows; row++) { DrawState currentState = DrawState.EMPTY; int[] from = new int[2]; int length = 0; for (int column = 0; column < pd.NumCols; column++) { switch (currentState) { case DrawState.EMPTY: if (pd.IsFilled(column, row)) { from[0] = column; from[1] = row; length = 1; currentState = DrawState.FILL; if (column == pd.NumCols - 1) { solution.AddCommand(solution.MakeHorizontalLine(from[0], from[1], length)); currentState = DrawState.EMPTY; } } break; case DrawState.FILL: if (!pd.IsFilled(column, row)) { solution.AddCommand(solution.MakeHorizontalLine(from[0], from[1], length)); currentState = DrawState.EMPTY; }else if (column == pd.NumCols - 1) { solution.AddCommand(solution.MakeHorizontalLine(from[0], from[1], ++length)); currentState = DrawState.EMPTY; } else { length++; } break; } } } return solution; }
private static void TryHorizontalLines(PictureDescription descriptor, Solution solution, ref Command? bestCommand, ref int bestScore) { for (int y = 0; y < descriptor.NumRows; ++y) { for (int x = 0; x < descriptor.NumCols;) { int startX = x; int endX = x; bool skipped = false; int score = 0; for (;;) { if (x >= descriptor.NumCols) { break; } if (descriptor.IsFilled(x, y)) { if (!solution.IsFilled(x, y)) { ++score; endX = x; } } else if (skipped) { skipped = true; } else { ++x; break; } ++x; } int len = endX - startX + 1; if (len > 0) { if (score > 0 && score > bestScore) { var command = solution.MakeHorizontalLine(startX, y, len); if (score > bestScore) { bestCommand = command; bestScore = score; } } } } } }