Одномерный вариант этой задачи было довольно легко, так что здесь сложнее 2D версия.
На стандартном входе вам дается двумерный массив высот земли, и вы должны выяснить, где образуются озера, когда идет дождь. Карта высот представляет собой просто прямоугольный массив чисел 0-9 включительно.
8888888888
5664303498
6485322898
5675373666
7875555787
Вы должны вывести тот же массив, заменив все места, которые были бы под водой *
.
8888888888
566*****98
6*85***898
5675*7*666
7875555787
Вода может вытекать по диагонали, поэтому в этой конфигурации не будет озера.
888
838
388
самый короткий код выигрывает. Ваш код должен обрабатывать размеры до 80 в ширину и 24 в высоту.
Еще три примера:
77777 77777
75657 7*6*7
75757 => 7*7*7
77677 77677
77477 77477
599999 599999
933339 9****9
936639 => 9*66*9
935539 9*55*9
932109 9****9
999999 999999
88888888 88888888
84482288 8**8**88
84452233 => 8**5**33
84482288 8**8**88
88888888 88888888
Ответы:
Haskell, 258 символов
Пример выполнения:
Проходит все юнит-тесты. Нет произвольных ограничений по размеру.
m
источник
Python,
483491 символовЯ уверен, что есть лучший (и более короткий) способ сделать это
источник
input()
сsys.stdin.read()
и удалите завершающую\n
из моих образцов входов.sys.stdin.read()
читает из файла, верно? Я все еще довольно новичок в Python.sys.stdin.read()
читает STanDard INput до EOF.input()
читает и оценивает одну строку стандартного ввода.Python,
478471 символов(Не включая комментарии.
452450 символов без учета импорта.)Идея в том, что я строю ориентированный граф, в котором каждая ячейка сетки имеет свою собственную вершину (плюс одну дополнительную «сливную» вершину). В графе есть ребро от каждой ячейки с более высокими значениями до соседних ячеек с более низкими значениями, плюс есть ребро от всех внешних ячеек до «сливной» вершины. Затем я использую Floyd-Warshall, чтобы вычислить, какие вершины связаны с «сливной» вершиной; любые не связанные вершины будут затоплены и обозначены звездочкой.
У меня нет большого опыта в сжатии кода Python, поэтому, возможно, есть более лаконичный способ, которым я мог бы реализовать этот метод.
источник
Common Lisp, 833
Никаких попыток сделать это не было, я просто нашел проблему интересной. Ввод - это двумерный массив карты. Решение проверяет каждый квадрат, чтобы увидеть, «сливается» ли он - квадрат сливается, если он находится на внешнем крае, или если он находится рядом с квадратом равной или меньшей высоты, который сливается. Чтобы избежать повторения бесконечно, в коде хранится «карта стока» (dm), в которой хранится состояние дренажа уже определенных квадратов.
источник
Питон, 246 символов
Решение работает путем создания DFS из каждой позиции, чтобы определить, заполнять или нет.
Если разрешен пробел в каждой строке, его можно сократить, используя w = 80 и дополнив входные строки пробелом до 80 символов.
источник