Це перший у серії викликів Island Golf. Наступний виклик
З огляду на острів ASCII-art, виведіть оптимальний шлях для його обходу.
Вхідні дані
Вашим входом буде прямокутна сітка, що складається з двох символів, що представляють землю та воду. У наведених нижче прикладах земля є, #
а вода є .
, але ви можете замінити будь-які два символи, які ви хочете.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Завжди буде хоча б одна плитка землі. Усі суходольні плитки будуть суміжними (тобто є лише один острів). Водяні плитки також будуть суміжними (тобто озер немає). Зовнішня межа сітки - це водопровідна плитка. Земляні плитки не будуть з'єднані по діагоналі: тобто ви ніколи не побачите чогось подібного
....
.#..
..#.
....
Вихідні дані
Ваш код повинен виводити ту саму сітку, на якій намальовано найкоротший кругообіг . У наведених нижче прикладах обводиться шлях обходу 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
(будь-ласка, вкажіть у поданні, які символи ви використовуєте).
Тестові справи
A. Острови з унікальними найкоротшими округами:
...
.#.
...
.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...
C. Великий тестовий випадок як суть
Це код-гольф : виграє найкоротший код на кожній мові.