Белый Прямоугольник (классическая задачка вместо приветствия)

5156787c3ed6b8b9f19a55d9532de5b7.png

Оказывается Хабр доброжелательно предоставляет возможность завести бесплатный «корпоративный» блог для опенсорсного проекта. Какое-то время назад я подал заявку — и недавно обнаружил что она была удовлетворена. Начинать программисты любят с «тестового» поста, но т.к. речь идёт о публичном пространстве, пусть он будет хоть немного содержательным :)

На сайт CodeAbbey сегодня добавилась задачка про поиск Белого Прямоугольника. Речь идёт о матрице в которой есть чёрные и белые клетки — расставленные достаточно хаотично — и хочется найти прямоугольник без чёрных клеток максимальной площади (со сторонами параллельными сторонам матрицы, конечно).

Про сам сайт мы ещё расскажем в отдельно (иначе зачем блог было заводить) -, а сейчас всё же про саму задачку.

Она, по-видимому, древняя как мир. Я на неё наткнулся где-то в конце книжки Ж.Арсака «Программирование Игр и Головоломок» — причём он упоминает что сам встретил её на какой-то олимпиадке за несколько лет до того. А книжка-то 1985 года.

Интересно что при очень простом описании самый банальный алгоритм который приходит в голову имеет сложность O(N^6) где N — сторона матрицы. Конечно нынешние компьютеры уже не те что в 80х годах, но если вы заимплементите такой «брутефорс» — то даже на скромных размерах тестовых данных которые предлагает сайт, работать он у вас будет сколько-то секунд… Заметно не мгновенно.

Гораздо более сносный алгоритм O(N^3) можно реализовать достаточно несложно (именно он срабатывает при загрузке страницы и генерации данных на сайте).

Возможно оптимальный алгоритм за O(N^2) уже требует немножко поднапрячь мозги -, но впрочем его не очень сложно нагуглить (сложнее понять).

© Habrahabr.ru