Disons que vous avez vu votre ami entrer son mot de passe dans son téléphone Android. Vous ne vous souvenez pas comment ils ont fait le motif mais vous vous souvenez à quoi ressemble le motif. Étant l'ami concerné que vous êtes, vous voulez savoir à quel point leur mot de passe est sécurisé. Votre travail consiste à calculer toutes les façons dont un motif particulier peut être créé.
Fonctionnement des modèles Android
Les motifs sont dessinés sur une grille 3x3 de nœuds. Dans un schéma, on visite une série de nœuds sans jamais lever le doigt de l'écran. Chaque nœud qu'ils visitent est connecté au nœud précédent par un bord. Il y a deux règles à garder à l'esprit.
Vous ne pouvez visiter aucun nœud plus d'une fois
Un bord ne peut pas traverser un nœud non visité
Notez que, bien que généralement très difficile à réaliser et donc peu courant dans les vraies combinaisons de verrouillage Android, il est possible de se déplacer comme un chevalier . Autrement dit, il est possible de passer d'un côté à un coin non adjacent ou dans l'autre sens. Voici deux exemples de modèles utilisant un tel mouvement:
Voici un Gif animé en cours d'exécution.
Résoudre un motif
Un modèle typique pourrait ressembler à ceci:
Avec un modèle simple comme celui-ci, il existe deux façons de dessiner le modèle. Vous pouvez commencer à l'une des deux extrémités libres et parcourir les nœuds en surbrillance à l'autre. Bien que cela soit vrai pour de nombreux modèles, en particulier ceux que les êtres humains utilisent généralement, ce n'est pas vrai pour tous les modèles.
Considérez le modèle suivant:
Il existe deux solutions immédiatement reconnaissables. L'un commençant en haut à gauche:
Et un commençant en bas au centre:
Cependant, comme une ligne est autorisée à passer par un point une fois qu'elle a déjà été sélectionnée, un motif supplémentaire commence au milieu supérieur:
Ce modèle particulier a 3 solutions, mais les modèles peuvent avoir entre 1 et 4 solutions [citation nécessaire] .
Voici quelques exemples de chacun:
1.
2.
3.
4.
E / S
Un nœud peut être représenté par les entiers de zéro à neuf inclus, leurs équivalents de chaîne ou les caractères de a à i (ou A à I). Chaque nœud doit avoir une représentation unique de l'un de ces ensembles.
Une solution sera représentée par un conteneur ordonné contenant des représentations de nœuds. Les nœuds doivent être classés dans le même ordre de passage.
Un motif sera représenté par un conteneur non ordonné de paires de nœuds. Chaque paire représente un bord commençant à relier les deux points de la paire. Les représentations de motifs ne sont pas uniques.
Vous prendrez une représentation de modèle en entrée via des méthodes d'entrée standard et sortirez toutes les solutions possibles qui créent le même modèle via des méthodes de sortie standard.
Vous pouvez supposer que chaque entrée aura au moins une solution et connectera au moins 4 nœuds.
Vous pouvez choisir d'utiliser un conteneur commandé à la place d'un conteneur non commandé, si vous le souhaitez ou si vous y êtes contraint par la sélection de la langue.
Cas de test
Avec les nœuds disposés dans le modèle suivant:
0 1 2
3 4 5
6 7 8
Soit {...}
un conteneur non ordonné, [...]
un conteneur ordonné et (...)
une paire.
Les entrées et sorties suivantes doivent correspondre
{(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)} -> {}
Un album imgur de tous les cas de test sous forme d'images peut être trouvé ici . Les motifs sont en bleu, les solutions en rouge.
Notation
C'est le golf de code. Le moins d'octets gagne.