алгоритм поиска всех подматриц и проверка их прямоугольности
Задача:
Ане подарили за успехи на олимпиаде таблицу n × m, состоящую из черных и белых клеток.
Она очень любит таблицы, которые состоят только из черных клеток, но не любит пересечения. Поэтому она называет подтаблицу красивой, если она состоит только из черных клеток, а также любая другая подтаблица, которая содержит в себе данную подтаблицу, содержит хотя бы одну белую клетку.
Здесь подтаблицей называется таблица, полученная удалением строк или столбцов снизу, сверху, справа или слева из подаренной таблицы.
И ей стало интересно, правда ли, что любые красивые подтаблицы не пересекаются. Помогите ей и ответьте на этот вопрос за нее.
Входные данные
Каждый тест состоит из нескольких наборов входных данных. В первой строке находится единственное целое число t (1 ≤ t ≤ 200) — количество наборов входных данных. Далее следует описание наборов входных данных.
В первой строке каждого набора входных данных содержатся два целых числа n, m (1 ≤ n, m ≤ 100) — размеры таблицы.
Далее следуют n строк длины m, состоящих из нулей и единиц — описание таблицы, где 0 означает белую клетку, а 1 черную.
Гарантируется, что сумма значений n и сумма значений m по всем наборам входных данных не превосходит 1000.
Выходные данные
Для каждого набора входных данных выведите
YES
, если в данной таблице никакие красивые прямоугольники не пересекаются. Иначе выведитеNO
.Вы можете выводить каждую букву в любом регистре (например,
YES
,Yes
,yes
,YeS
) — будут распознаны как положительный ответ.
Пример:
ввод / вывод
5
4 5
11111 no
00100
00100
00100
5 5
11011 yes
11011
11000
11011
11011
5 4
1111 no
1001
1111
1001
1001
4 4
1001 no
1101
1011
1001
5 4
1001 no
1010
1100
1010
1001
Если я правильно понял, каждая подматрица из единиц должна быть прямоугольной, если это не так, ответ "no".
Как реализовать подобный алгоритм? Я гуглил, спрашивал у ИИ, единственное что нашлось по этому вопросу - это решение через поиск максимальной подматрицы. Я так понимаю, это делается до тех пор, пока не будет пройдена вся таблица. Соответственно, уже пройденные ячейки где-то нужно сохранять, будет масса вложенных циклов и очень жадный алгоритм. Если я все правильно понимаю, там настолько много условий нужно соблюсти, что написать этого монстра у меня не получилось.
Скажите, пожалуйста:
Существует ли какое-то элегантное решение?
Решается ли задача через нахождением максимальной матрицы при помощи гистограммы?
Еще есть гипотеза, что нужно находить подматрицу, "вырезать" эту подматрицу + 1 строку/столбец там, где должны быть нули, и проверять как раз вот эту строку, отмечая пройденные ячейки, и продолжать так, пока не будет найдена единица среди нулей, либо не будет пройдена вся матрица. Сработает ли это?
Какие есть идеи, как решить эту задачу?
5.ДОБАВЛЕННЫЙ ВОПРОС можно ли построить аргументацию на входных данных
А1 и В1 - подтаблица кандидаты на "красивую"
А2 и В2 - подтаблицы содержащие в себе минимум один ноль и подтаблицы-кандидаты