@fjaerj12

Где ошибка в алгоритме создания плоской выпуклой фигуры?

Задача:
Рассмотрим бесконечный лист клетчатой бумаги. Закрасим некоторое множество клеток в черный цвет. Теперь мы хотим закрасить минимальное количество клеток, так, чтобы множество черных клеток стало выпуклым.

Напомним, что геометрическая фигура Φ называется выпуклой, если для любых точек A из Φ и В из Φ с вещественными координатами отрезок [AB] принадлежит Φ.

Входные данные
В первой строке входного файла INPUT.TXT содержатся два числа N и M (1 ≤ N, M ≤ 100) — размеры куска бумаги, куда попали все черные клетки. В каждой из следующих N строк содержится М символов «*» или «.». Символ «*» обозначает черную клетку, а «.» белую.

Выходные данные
В выходной файл OUTPUT.TXT выведите выпуклое множество, содержащее минимальное количество дополнительно покрашенных черных клеток, в ровно N строках по M символов «*» или «.» в каждой.

Примеры

Вход:
2 4
..*.
.**.
Выход:
.**.
.**.

Вход:
4 3
.*.
.*.
.*.
.*.
Выход:
.*.
.*.
.*.
.*.

Большинство входных данных обрабатывается верно, но при попытке сдать на сайте появляются неверные ответы.
Идея: найти минимальные и максимальные строки и колонки, в которых находится символ звёздочки, затем вывести то, что находится внутри найденных границ, со звёздочками, а остальное - с точками.

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    int rows = 0, columns = 0;

    std::ifstream file("INPUT.txt");
    std::cin >> rows;
    std::cin >> columns;


    int rMax = 0, rMin = 101, cMax = 0, cMin = 101;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            char c;
            file >> c;
            if (c == '*' && i < rMin) 
            {
                rMin = i;
            }
            if (c == '*' && i > rMax) 
            {
                rMax = i;
            }
            if (c == '*' && j < cMin)
            {
                cMin = j;
            }
            if (c == '*' && j > cMax) 
            {
                cMax = j;
            }
        }
    }
    file.close();

    std::ofstream fout("OUTPUT.txt");

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            if (i >= rMin && rMax >= i && cMax >= j && cMin <= j)
            {
                fout << "*";
            }
            else
            {
                fout << ".";
            }
        }
        
        fout << std::endl;     
    } 
    fout.close();
}
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
На будущее: пишите вместе с задачей вашу идею решения.

Уберите ненужные переменные. Еще, зачем у вас там i % columns?

Похоже, надо в output.txt выводить, а не в stdout.

Еще, советую выводить перевод строки всегда, и не пропускать его на последней строке вывода.

Чтобы не было проблем с пробельными символами - читайте в двух вложенных циклах до rows и columns по одному char (а не string до eof). Это и ввод упростит и сделает его более безопасным ко всяким артефактам в тестах.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы