Описание задачи
Давайте назовем двумерный прямоугольный массив (т.е. каждый его подмассив имеет одинаковую длину) сеткой . Каждая единица сетки - это либо пустое пространство, либо граница . В сетке символов пустое пространство представлено одним пробелом; любой другой символ рассматривается как граница. Примеры таблиц ( для удобства чтения добавлены +
«s», |
«s» и -
« они» - они не являются частью сетки ):
+----+
| |
| |
| |
| |
| |
+----+ an empty 4x5 grid
+------+
| |
| # |
| # |
+------+ a 6x3 grid with 2 borders
+----------+
| |
| |
| ##### |
| # # |
| ## # <------ enclosed area
| # # |
| ###### |
| |
+----------+ a 10x8 grid with an enclosed area
Учитывая двумерную сетку и пару координат, заполните закрытую область, окружающую точку, представленную координатами.
Образцы входов / выходов
1)
0 0
+----------+ +----------+
| | |XXXXXXXXXX|
| | -> |XXXXXXXXXX|
| | |XXXXXXXXXX|
+----------+ +----------+
2)
6 5
+-----------------+ +-----------------+
| | | |
| | | |
| ######## | | ######## |
| # # | | #XXXXXXX# |
| # #### | | #XXXX#### |
| # # | | #XXXX# |
| # # | -> | #XXXX# |
| # # | | #XXXX# |
| #### | | #### |
| | | |
| | | |
+-----------------+ +-----------------+
3)
4 6
+-----------------+ +-----------------+
| | |XXXXXXXXXXXXXXXXX|
| #### | |XXXX####XXXXXXXXX|
| # # | -> |XXX# #XXXXXXXX|
| #### | |XXXX####XXXXXXXXX|
| | |XXXXXXXXXXXXXXXXX|
+-----------------+ +-----------------+
4)
4 5
+-----------------+ +-----------------+ +-----------------+
| | | | | |
| | | | | |
| #### | | #### | | XXXX |
| #### | -> | #### | or | XXXX |
| #### | | #### | | XXXX |
| | | | | |
+-----------------+ +-----------------+ +-----------------+
5)
2 6
+----------------+ +----------------+
| | |XXXXXXXXXXXXXXXX|
| | |XXXXXXXXXXXXXXXX|
| | |XXXXXXXXXXXXXXXX|
| | -> |XXXXXXXXXXXXXXXX|
| | |XXXXXXXXXXXXXXXX|
|BBBBBBBBBBBBBBBB| |BBBBBBBBBBBBBBBB|
| | | |
| | | |
+----------------+ +----------------+
Ноты
Пустая сетка считается вложенной, то есть границы также неявно расположены по краям сетки (см. Примеры 1. и 5.),
Угол замкнутого пространства не обязательно должен быть L-образным. Следующие две области, следовательно, эквивалентны:
#### ##
# # # #
# # == # #
# # # #
#### ##
Если юнит под координатами оказывается границей, вы можете либо оставить сетку без изменений (как в примере 4.), либо рассматривать ее как пустое пространство,
Вы можете выбрать любой символ для заполнения / пустого пространства, если вы включите эту информацию в представление,
Если вы используете тип, отличный от
char
ваших целей, вы можете использоватьints
(0
для пустого пространства,1
для границы) илиbooleans
(true
иfalse
соответственно) или любой другой тип - просто убедитесь, что вы включили эту информацию в свое представление,Координаты, используемые в примерах выше, являются 0-индексированными
(row, column)
координатами, так как это более удобно для двумерного массива. Если вы хотите использовать(column, row)
(декартову) систему и / или не-индексированные координаты, укажите это в своем представлении.Если вы не знаете, с чего начать, посмотрите статью в Википедии о заливке
Помните, что это Код-гольф вызов, поэтому сделайте ваш код как можно короче!
источник
Ответы:
MATLAB,
307 байтовПоскольку мы можем использовать логические входы вместо строк, мы можем использовать голую функцию, как она есть:
Это анонимная функция. Для использования мы должны принять имя, например
f=@
imfill
. Тогда мы можем просто оценить это какf(input,point)
, гдеinput
находится логическая матрица, например,[0,0;0,1]
, иpoint
2d-вектор с основанными на 1 координатами, например[1,2]
.Старая версия работает над строками:
Эта анонимная функция принимает входные данные, а также вектор с координатами (индекс на основе 1). Функция
imfill
делает именно то, что нам нужно, но работает только с двоичными изображениями. Вот почему мы конвертируем входную матрицу в логический массив (где#
границы, а(пробелы) - пустота), выполняют заполнение и затем преобразуются обратно. (снова
#
заполнено, пространство не заполнено).Спасибо @LuisMendo за -
1байт.источник
~=32
на>32
C 162 байта
Принимает входные данные от аргументов (
./floodfill X Y grid
). Сетка должна содержать\n
или\r\n
между каждой строкой, окончательный перевод новой строки не является обязательным. Простейший способ, который я нашел для вызова из оболочки:Вывод в стандартный вывод, используя
!
для заполнения символа. Если начальная позиция совпадает с#
, не вносит изменений.Сломать:
Обратите внимание, что это зависит от изменения строки входного аргумента, что запрещено, поэтому это может не работать на всех платформах (неявные объявления также делают это нестандартным).
источник
int w, l;
простоw, l;
- НКУ по умолчанию этоint
типC -
263247240238 байтЭто
перваявтораятретья версия, я думаю, что код тоже можно сжать.И читаемая версия:
Скомпилируйте и запустите:
gcc -o flood floodgolf.c && cat 1.txt | ./flood
Ресурсы:
Примечание: я работаю над
int
ценностями. Каждый(32) рассматривается как пустое пространство. Любое другое значение рассматривается как граница. Координаты в формате
(row, column)
источник
for
(scanf
здесь), и используя первый параметр main как дешевое объявление int, будет работать в большинстве компиляторов. Также вы можете сэкономить, сгладив массив (это, безусловно, должно помочь циклу печати)Python 2, 158 байт
Попробуйте онлайн . Простое рекурсивное решение
0 индексируется в порядке строк-столбцов
1 - пустое пространство, 0 - заполненное пространство
Принимает ввод в виде массива массивов 1 и 0 и двух чисел
источник
Perl 5 , 129 + 1 (-a) = 130 байт
Попробуйте онлайн!
Как?
источник