Ця проблема полягає в перетворенні 2D лабіринтів у 1D лабіринти.
Огляд
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | |A| | B| A B A -- D
+ + + + +-+-+ + + + + +-+-+ \ | C -- D
| | | | | | | | \ | D -- E
+-+-+ +-+-+ + +-+-+ +-+-+ + \ | E -- F
| | |C D E F| C---D-E---F E -- G
+-+-+-+ +-+ + +-+-+-+ +-+ + | | B -- F
| | | | G | | .---G | F -- J
+ +-+-+-+ + + + +-+-+-+ + + .' / | G -- H
| | | | |H|I |J| H I-' J G -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 1 Figure 2 Figure 3
Для цілей цього виклику традиційний 2D лабіринт - це прямокутний лабіринт, сформований з точок решітки, де містяться всі наступні дії:
- Він закритий (зовнішній ободок з'єднаний стінами).
- Всі точки решітки з'єднані зі стінами
- Він пов'язаний (для кожні два проміжки X і Y є шлях між ними)
- Це ациклічно (немає жодного шляху X назад до X без зворотного відстеження)
На малюнку 1 показаний традиційний 2D лабіринт. Ці лабіринти мають три сфери інтересу:
- Тупики - місця, з яких є лише один доступний шлях
- Коридори - місця, з яких є дві наявні шляхи
- Точки прийняття рішень - місця, з яких є три або чотири доступних шляху
Для кожного такого лабіринту можна створити графік, де кінці та точки прийняття рішень є вузлами, а між кожними двома вузлами є край, пов'язаний стежкою по коридору. На малюнку 2 показаний такий самий лабіринт з такими вузлами, що позначені, а на малюнку 3 - графік лабіринту (у точках позначення точок ASCII та Graphviz).
1D лабіринти
1D лабіринти містять основи, які складаються парами і ідентифікуються за допомогою літери (в будь-якому випадку). На малюнку 4 показаний приклад 1D-лабіринту. Це в іншому випадку ідентично двовимірному лабіринту висотою 1, як показано на малюнку 5. Зокрема, на малюнку 5 відзначте позиції точки решітки, позначені символом +
, які чергуються зліва направо; у лабіринті 1D кожен інший символ, що починається з самої лівої стінки, також є точкою грат.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| D| D E|G E F| F | G | | D| D E|G E F| F | G |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4 Figure 5
Правила навігації по цьому лабіринту наступні. Кожен хід може бути представлений як вперед ( >
), так і назад ( <
). Тут вперед і назад за замовчуванням мають те саме значення, що й наше інтуїтивне просторове усвідомлення; вперед йде в положення відразу праворуч, а назад відразу вліво.
Точки викривлення представляють місця, які асиметрично змінюють зв'язок із сусідами. Якщо ви переходите від сусіда до точки викривлення, положення двох точок перекону змінюється; якщо ви переходите з точки викривлення до сусіда, вони не поміняються. Наприклад, на рисунку 6 переміщення назад від 1 приводить вас до 2 (оскільки 1 - сусід G, а ми рухаємося від сусіда, точки 2 і @ змінюються місцями). Якщо рухатись вперед від точки 2 (точка викривлення G), ви приведете до рівня 3 (тут ми починаємо з деформації, тому підміна немає). Так само переміщення назад від 3 приведе вас до @.
54 2367 89^ @1
| D| D E|G E F| F | G |
Y X
Figure 6
На малюнку 6 також показаний приклад навігації від X до Y, використовуючи послідовність рухів <<>><>>>>>
. Ці кроки приводять вас до точок, позначених 123456789^
відповідно, у такому порядку. Не соромтеся досліджувати його самостійно, використовуючи фрагмент коду в наступному розділі.
Перетворення 2D в 1D
Враховуючи 1D-лабіринт, можна створити графік, де кожен вузол є або тупиком, або парою основи, а краї існують між будь-якими двома вузлами, з'єднаними уздовж коридору. Цей графік дозволяє порівняти 1D та 2D лабіринти.
Наприклад, 1D лабіринт на рисунку 4 - це той самий лабіринт, що на малюнку 1. Щоб зрозуміти, чому, малюнок 7 додає мітки до тупиків. Використовуючи ці мітки для побудови графіка, графік рисунка 7 просто знову зображений на рисунку 3. На малюнку 8 показано прорив побудови цього графіка.
| D| D E|G E F| F | G |
A C B J H I
Figure 7
| D| D E|G E F| F | G |
+ + + + + + + + + + + + + + + <- lattice points
|A |C | |B J|H I| <- dead ends
|A D|C D E|G E F|B F J|H G I| <- all nodes (dead ends+warp points); i.e.:
"where each end is either a dead end
or a warp point pair"; note that each
pair of warp points is the same node.
|A-D|C-D-E|G-E-F|B-F-J|H-G-I| <- corridors; note each is a connection, since
1 2 3 4 5 6 7 8 9 "edges exist between any two nodes
connected along a corridor"
graph { graph {
A -- D // 1 <----> A -- D
C -- D // 2 <----> C -- D
D -- E // 3 <----> D -- E
G -- E // 4 <----> E -- G
E -- F // 5 <----> E -- F
B -- F // 6 <----> B -- F
F -- J // 7 <----> F -- J
H -- G // 8 <----> G -- H
G -- I // 9 <----> G -- I
} ^ }
Built from | From Figure 3
1D maze `-> isomorphic mappings
Figure 8
(Зверніть увагу, що мітки та макет кожного графа були штучно вибрані для вирівнювання для ілюстрації; загалом кажучи, це проблема ізоморфізму графіка ).
Наступний фрагмент надається, щоб допомогти візуалізувати механіку 1D-лабіринту та зв’язок між 1D-лабіринтом, графіком еквівалентності та 2D-лабіринтом.
Під час переміщення по 1D лабіринту в цьому фрагменті виділяються останні два вузли, які ви торкаєтеся. Ті ж вузли виділяються однаково на графіку еквівалентності та 2D-лабіринті.
Загалом для будь-якого традиційного 2D лабіринту може бути створений еквівалентний 1D лабіринт цього типу. Дещо складнішим прикладом є малюнок 9:
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | | |A| | |B| A B A -- D
+ + + + + + + + + + + + + + \ / C -- D
| | | | | | | | | | \ / D -- E
+-+-+ + +-+-+ +-+-+ + +-+-+ \ / B -- E
| | |C D E | C---D-E E -- F
+-+-+-+ +-+ + +-+-+-+ +-+ + |\ E -- I
| | | | F | | .---F \ F -- G
+ +-+-+-+ + + + +-+-+-+ + + .' / \ G -- H
| | | | |G|H |I| G H-' I H -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 9 Figure 10 Figure 11
| D| D E |F E | F | | D| D E |F E | F |
A C I B G H
Figure 12 Figure 13
Цей лабіринт має вузол з чотирма шляхами (E на малюнку 10). На малюнку 11 показано його графік. Фіг.12 - еквівалентний 1D лабіринт; і на малюнку 13 показаний такий же лабіринт з мітками для тупиків для порівняння з малюнком 11.
Виклик
Подавши 2D лабіринт як вхід, напишіть функцію або програму, яка перетворює 2D лабіринт у 1D лабіринт з точками деформації. У точці викривлення може використовуватися будь-яка з 52 букв у кожному випадку.
Гарантії введення (якщо будь-яке з них не виконано на вході, вам не доведеться з цим боротися):
- Лабіринт введення підключений (тобто ви завжди можете перейти з будь-якої точки до будь-якої іншої).
- Вхідний лабіринт закритий.
- Вхідний лабіринт прямокутний.
- Використовуються всі точки решітки
+
. - Використовуються всі стіни між точками решітки в одному ряду
|
- Використовуються всі стіни між точками решітки в одному стовпчику
-
. - Усі простори є частиною стежки (і все всередині лабіринту).
- Шляхи - це всі простори (це завжди буде традиційно, без перешкод)
- Шляхи - це рівно один простір.
- Лабіринт будується з'єднанням точок на решітці.
- У графі лабіринту не більше 52 загальних вузлів (тобто тупиків плюс пунктів рішення).
Формат виводу:
- Вихід повинен бути одним рядком із зображенням 1D лабіринту.
- У вашому виході не повинно бути пробілів проміжних / кінцевих пробілів; за винятком того, що заздалегідь новий рядок відмінний.
- Перший символ і кожен другий символ згодом - це точки решітки.
- Всі стіни повинні бути на точках грат; і всі точки викривлення між ними.
- Графік 1D-лабіринту повинен бути еквівалентний графіку 2D-лабіринту.
- Ваші 1D лабіринти повинні бути компактними; всі точки, що не мають решітки, повинні бути тупиками (тобто прилеглими до стін) або точковими основами.
- В тільки букви в вашому виведення повинні бути точки основи. Кожна викривна точка трапляється на лінії рівно двічі.
Приклад:
| D| D E|G E F| F | G | <- (1,2) The single line output
+ + + + + + + + + + + + + + + <- lattice point spacing... (3)
(4,6) lattice points are all walls or spaces
(5) See Figure 8
(7) D, E, F, G appear twice; no other labels
Це код-гольф. Переможець - це правильне подання, що не має лайків, з найменшими байтами.
Тестування
Немає тестових випадків для цього виклику, оскільки існує велика кількість правильних результатів для будь-якого нетривіального лабіринту.
Однак я вбудував шашку в C ++ (ця перевірка графікує обидва рішення за допомогою кананізації графіка ).
Крім того, ось кілька прикладів, які допоможуть проілюструвати правильне форматування:
Приклад 1
+-+-+-+-+-+-+
| | | |
+ + + + +-+-+
| | | |
+-+-+ +-+-+ +
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E|G E F| F | G |
Приклад 2
+-+-+-+-+-+-+
| | | | |
+ + + + + + +
| | | | |
+-+-+ + +-+-+
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E |F E | F |