Это первый из серии испытаний Island Golf. Следующая задача
Учитывая остров в ASCII-искусстве, выведите оптимальный путь для его обхода.
вход
Ваш ввод будет прямоугольной сеткой, состоящей из двух символов, представляющих землю и воду. В приведенных ниже примерах земля есть, #
а вода есть .
, но вы можете заменить любые два разных символа по вашему желанию.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Там всегда будет хотя бы одна плитка земли. Плитки земли все будут смежными (то есть есть только один остров). Водяные плитки также будут смежными (т.е. там нет озер). Внешняя граница сетки будет водяной плиткой. Плитки земли не будут связаны по диагонали: то есть вы никогда не увидите ничего подобного
....
.#..
..#.
....
Выход
Ваш код должен выводить ту же сетку с нарисованной кратчайшей круговой навигацией. В приведенных ниже примерах путь кругового плавания начертан o
, но вы можете заменить любого персонажа, если он отличается от ваших символов земли и воды.
Кругосветное является простой замкнутой кривой, составленный полностью на воде плитки, которая полностью окружает все наземные плитки на сетке. Диагональные соединения будут разрешены. Например, это кругосветное плавание над островом (но не самое короткое):
.ooooo.....
o..##.oo...
o.#####.o..
o.#######o.
o#########o
ooo#######o
..o#####.#o
..oo####..o
....oooooo.
Длина кругового плавания вычисляется следующим образом: для каждой пары соседних плиток на пути, если они соединены горизонтально или вертикально, добавьте 1; если они связаны по диагонали, добавьте √2. Длина указанного пути составляет 22 + 7√2 (≈ 31,9).
Самым коротким кругосветным плаванием является кругосветное плавание с наименьшей возможной длиной. Ваша программа должна выводить любой путь, который удовлетворяет этому условию. Для большинства островов будет несколько возможных решений. Вот одно решение для указанного острова длиной 10 + 13√2 (≈ 28,4):
...oo......
..o##oo....
.o#####oo..
.o#######o.
o#########o
.o.#######o
..o#####.#o
...o####.o.
....ooooo..
Детали
Ваше решение может быть полной программой или функцией . Любой из методов ввода и вывода по умолчанию является приемлемым.
Ваш ввод и вывод может быть многострочной строкой или списком строк. Если ваш язык имеет символьный тип, отличный от односимвольных строк, вы можете заменить «список символов» на «строку» в предыдущем предложении. Если вашему языку нужно ввести высоту и / или ширину сетки, вы можете сделать это. Ваш вывод может (опционально) иметь один завершающий перевод строки. Как упоминалось выше, вы можете использовать любые три различных символа вместо #.o
(пожалуйста, укажите в своем представлении, какие символы вы используете).
Контрольные примеры
А. Острова с уникальными кратчайшими кругосветными плаваниями:
...
.#.
...
.o.
o#o
.o.
......
.####.
......
.oooo.
o####o
.oooo.
......
......
..##..
...#..
......
......
......
..oo..
.o##o.
..o#o.
...o..
......
.......
.#####.
...#...
...#...
.#####.
.......
.ooooo.
o#####o
o..#..o
o..#..o
o#####o
.ooooo.
.......
...#...
...#...
.#####.
...#...
...#...
.......
...o...
..o#o..
.o.#.o.
o#####o
.o.#.o.
..o#o..
...o...
.......
.#####.
.##..#.
..#..#.
.......
.ooooo.
o#####o
o##..#o
.o#..#o
..oooo.
Б. Пример острова с несколькими возможными решениями:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Возможные выводы:
....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##oo..
..oo....
....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##.o..
..ooo...
....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##oo..
..oo....
....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##.o..
..ooo...
Это код-гольф : выигрывает самый короткий код на каждом языке.