Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Найти наибольший по площади прямоугольник из единиц в матрице

Максим Ученик (193), закрыт 17 лет назад
Помогите решить:
Дана матрица M*N, состоящая из "0" и "1".
Найти в ней наибольший по площади прямоугольник, состоящий только из единиц.
Алгоритм должен работать быстро.
Лучший ответ
Vitaly Мыслитель (6781) 17 лет назад
Добрый вечер !

Самым простым способом решить поставленную задачу будет: метод перебора; а именно:
Предположим у нас есть матрица 10 на 12 элементов, следующего вида:

Видно, что максимальную площадь имеет прямоугольник выделенный зеленым цветом. (4*6=24).

Алгоритм может быть следующим:

1). Определение принадлежности:
Берется первый элемент матрицы (1,1); (х, у)
Если он равен единице, то он считается потенциально возможным элементом прямоугольника, если нет, то переходим к следующему элементу (2,1);
В нашем случае элемент (1,1) равен единице, а значит можно начать сканирование.

2). Сканирование размеров потенциального прямоугольника:
Рассматриваем строку, в которой стоит элемент, берем элемент (1,2);
Если он равен единице, то рассматриваем следующий элемент в строке до тех пор, пока не натыкаемся на 0. В результате получаем максимально возможную ширину прямоугольника. В нашем случае она равна пяти.
Далее спускаемся на строчку ниже (2,1);
Сканируем ее аналогичным образом.
Если первый же элемент новой строки (2,1) равен нулю, то операции с первым элементом матрицы прекращаются и мы переходим ко второму… В этом случае площадь прямоугольника, принадлежащего первому элементу матрицы будет равна 5*1=5.
Запоминаем ее в стек (так же можно занести его координаты, если это необходимо по заданию) .
В случае, если первый элемент новой строки не равен нулю, то мы так же сканируем ее по длине до встречи первого нуля.
Если в этой строке 0 встречается раньше, чем в предыдущей, то максимальная длина прямоугольника автоматически уменьшается до этого значения. (В нашем случае они равны) .
Сканируется третья строка (3,1), в первом элементе которой стоит 0. Алгоритм закончен.
Найденный прямоугольник имеет площадь 5*2=10.

3). Переход к следующему элементу:
Сдвигаемся по координате Х на единицу (1,2). И выполняем аналогичные действия по пунктам 1,2. В результате чего находим самый большой прямоугольник (но пока об этом не знаем) 4*6=24.
Переходим к следующему элементу, находим 3*6=18, к следующему: 2*7=14…
После прохода всей матрицы нам лишь стоит упорядочить по возрастанию весь стек и выбрать наибольший элемент и его координаты (координаты можно задавать двумя точками начала и конца диагонали прямоугольника) .
Все. Прямой алгоритм написан.
Остальные ответы
Владимир Коробицин Мудрец (16046) 17 лет назад
Метод Гаусса!! Делаем в первой строке на первом месте единицу методом перестановки столбцов.
Вторая строка -методом исключения - под единицей должен быть ноль. И так далее по алгоритму Гаусса!!
Va1man Ученик (127) 3 года назад
Метод не рабочий в данном случае (выделена зелёным найденная подматрица):
Придётся как минимум прикручивать сохранение размера при каждом изменении длины строки и проверку делать на то больше площадь или нет. В общем, отчасти проблемный способ. Хотя, возможно, этот костыль с постоянным сравнением или записью абсолютно всех площадей и подразумевался.
Похожие вопросы