Найти количество прямоугольников в двумерном байтовом массиве


12
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000001111111111111100000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000011111100000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000000000000000000000000000011111111111111100000000000000000
0000000000000111111000000000000000000011111111111111100000000000000000
0000000000000100001000000111111000000011111111111111100000000010000000
0000000000000100001000000111111000000000000000000000011000000000000000
0000000000000111111000000111111000000000000000000000011000000000000000
0000000000000000000000000000111111000000000000000000000000000000000000
0000000000000000000000000000111111000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000

Вам дан двумерный массив байтов размером mx n. Гарантируется, что все байты равны 1 или 0. Найдите количество прямоугольников, представленных 1, при просмотре в 2d, как показано выше.

Для подсчета учитываются только полностью заполненные прямоугольники.
Прямоугольники должны быть окружены нулями, если они не находятся на краю (хотя прямоугольники, соприкасающиеся с диагональю 1, вполне допустимы (см. Пример.)).

Например, в приведенном выше массиве есть 5 правильных прямоугольников.

Вы можете использовать любой язык.


1
Я думаю, что лучший способ сказать это - сказать, что: прямоугольники должны быть окружены
нулями

Выполнено. Спасибо за формулировку на лучшем английском.
микробиан

Как насчет 1100\n1100\n0011\n0011?
Cruncher

1
Я думаю, именно поэтому я написал «смежные / перекрывающиеся». Это 2 правильных прямоугольника из моего первоначального намерения. Но «окружающее» условие ограничивает их сейчас. У вас есть лучший способ объяснить это
микробиан

1
Даже в смежных условиях неоднозначно, означает ли диагональ соседние или нет. Та же самая двусмысленность, окруженные ли средства или нет, окруженные в углах, или только стороны
Cruncher

Ответы:


2

GolfScript, 107 символов

.n?):L;'1'/{,}%{1$+)}*;][]\{:A{{+}+[1L.~)-1]%&}+1$\,.@^\[[[A]]+{|}*]+}/{.{L%}{%$..&1$,1$,/*$=}:C~\{L/}C&},,

Ввод должен быть дан на STDIN.

Примеры:

11
01
-
0

111
111
-
1

100
001
001
-
2

11100
10101
11100
-
1

101
010
101
-
5

См. Комментарии выше - кажется, что «действительные» прямоугольники должны иметь ширину / высоту как> 1.
Пол Р

@PaulR Это правило не написано в вопросе, по всем разумным определениям, это совершенно мелкие прямоугольники - возможно, я добавлю это позже.
Говард

Я согласен с вашим определением - я просто отметил несоответствие в комментариях - похоже, что ОП необходимо обновить вопрос, чтобы сделать его более определенным.
Paul R

Я уточнил, что прямоугольник размера 1 действителен.
микробиан

Но вы также сказали в комментариях в ответ: «Только для пояснения, вырожденные прямоугольники не должны быть подсчитаны, верно? Например, недействительны единичная 1 или одна подстрока / подколонка смежной 1?» говоря: «Да, они недействительны, и не должны учитываться».
Paul R
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.