Скажімо, ви бачили, як ваш друг вводив свій пароль у свій телефон Android. Ви не пам'ятаєте, як вони зробили візерунок, але ви пам’ятаєте, як виглядає візерунок. Будучи заклопотаним другом, що ти хочеш знати, наскільки захищений їх пароль. Ваше завдання - обчислити всі способи створення певної схеми.
Як працюють шаблони Android
Візерунки малюються на 3х3 сітці вузлів. За малюнком один відвідує ряд вузлів, ніколи не піднімаючи палець від екрану. Кожен вузол, який вони відвідують, з'єднаний краєм з попереднім вузлом. Майте на увазі два правила.
Ви можете не один раз відвідувати один вузол
Край може не проходити через невидимий вузол
Зауважте, що, як правило, дуже складно виконати і, отже, не дуже часто зустрічатися в реальних комбінаціях андроїд-замків, можна пересуватися, як Лицар . Тобто, можна переходити з одного боку в не сусідній кут або навпаки. Ось два приклади моделей використання такого кроку:
Ось анімований Gif цього виконавця.
Розв’язання візерунка
Типовий візерунок може виглядати приблизно так:
З таким простим візерунком, як цей, існує два способи, як два намалювати візерунок. Можна починати з будь-якого з двох вільних кінців і проїжджати через виділені вузли до іншого. Хоча це справедливо для багатьох моделей, особливо тих, які зазвичай використовують люди, це не стосується всіх моделей.
Розглянемо таку схему:
Є два негайно впізнавані рішення. Один починається у верхньому лівому куті:
І один, починаючи з нижнього центру:
Однак через те, що рядку дозволено проходити через точку, коли вона вже була обрана, у верхній середині є додатковий візерунок:
Цей конкретний малюнок має 3 рішення, але шаблони можуть мати будь-яке місце між 1 і 4 рішеннями (потрібне цитування) .
Ось кілька прикладів кожного:
1.
2.
3.
4.
I / O
Вузол може бути представлений у вигляді цілих чисел від нуля до дев'яти включно, їх еквівалентів рядків або символів від a до i (або від A до I). Кожен вузол повинен мати унікальне представлення одного з цих наборів.
Рішення буде представлено упорядкованим контейнером, що містить представлення вузлів. Вузли повинні бути впорядковані в тому ж порядку, через який вони пройшли.
Візерунок буде представлений не упорядкованим контейнером з пар вузлів. Кожна пара являє собою край, починаючи з'єднуючи дві точки в парі. Представлення шаблонів не є унікальними.
Ви візьмете представлення шаблону як вхід за допомогою стандартних методів введення та виведете всі можливі рішення, які створюють один і той же шаблон за допомогою стандартних методів виведення.
Можна припустити, що кожен вхід матиме щонайменше одне рішення та з'єднає щонайменше 4 вузли.
Ви можете скористатися замовленим контейнером замість не упорядкованого, якщо ви цього хочете або вас змушують вибрати мову.
Випробування
З вузлами, розташованими за наступним малюнком:
0 1 2
3 4 5
6 7 8
Дозвольте {...}
бути не [...]
упорядкованим контейнером, (...)
будьте упорядкованим контейнером і будьте парою.
Наступні входи та виходи повинні відповідати
{(1,4),(3,5),(5,8)} -> {[1,4,3,5,8]}
{(1,4),(3,4),(5,4),(8,5)} -> {[1,4,3,5,8]}
{(0,4),(4,5),(5,8),(7,8)} -> {[0,4,5,8,7],[7,8,5,4,0]}
{(0,2),(2,4),(4,7)} -> {[0,1,2,4,7],[1,0,2,4,7],[7,4,2,1,0]}
{(0,2),(2,6),(6,8)} -> {[0,1,2,4,6,7,8],[1,0,2,4,6,7,8],[8,7,6,4,2,1,0],[7,8,6,4,2,1,0]}
{(2,3),(3,7),(7,8)} -> {[2,3,7,8],[8,7,3,2]}
{(0,7),(1,2),(1,4),(2,7)} -> {[0,7,2,1,4],[4,1,2,7,0]}
{(0,4),(0,7),(1,3),(2,6),(2,8),(3,4),(5,7)} -> {[1,3,4,0,7,5,8,2,6]}
{(1,3),(5,8)} -> {}
Imgur альбом всіх тестів як фотографії можна знайти тут . Візерунки в синіх розчинах червоного кольору.
Оцінка балів
Це код гольфу. Виграє найменше байт.