Digamos que você tenha visto seu amigo digitar a senha dele no telefone Android. Você não se lembra como eles criaram o padrão, mas lembra como ele é. Sendo o amigo em causa que você é, você quer saber o quão segura é a senha deles. Seu trabalho é calcular todas as maneiras pelas quais um padrão específico pode ser feito.
Como os padrões do Android funcionam
Os padrões são desenhados em uma grade 3x3 de nós. Num padrão, visita-se uma série de nós sem nunca levantar o dedo da tela. Cada nó que eles visitam é conectado ao nó anterior por uma borda. Há duas regras a serem lembradas.
Você não pode visitar nenhum nó mais de uma vez
Uma aresta não pode passar por um nó não visitado
Observe que, embora normalmente seja muito difícil de executar e, portanto, não seja muito comum em combinações reais de bloqueio do Android, é possível se mover como um cavaleiro . Ou seja, é possível mover de um lado para um canto não adjacente ou vice-versa. Aqui estão dois exemplos de padrões que empregam essa mudança:
Aqui está um GIF animado dele sendo executado.
Resolvendo um padrão
Um padrão típico pode ser algo como isto:
Com um padrão simples como este, existem duas maneiras pelas quais desenham o padrão. Você pode começar em uma das duas pontas soltas e viajar pelos nós destacados para o outro. Embora isso seja verdade para muitos padrões, particularmente aqueles que os seres humanos normalmente empregam, isso não é verdade para todos os padrões.
Considere o seguinte padrão:
Existem duas soluções imediatamente reconhecíveis. Um começando no canto superior esquerdo:
E um começando no centro inferior:
No entanto, como é permitido que uma linha passe através de um ponto depois de já ter sido selecionada, existe um padrão adicional começando no meio superior:
Esse padrão específico tem 3 soluções, mas os padrões podem ter entre 1 e 4 soluções [citação necessário] .
Aqui estão alguns exemplos de cada um:
1
2)
3)
4)
I / O
Um nó pode ser representado como números inteiros de zero a nove, inclusive, seus equivalentes de cadeia ou os caracteres de a a i (ou A a I). Cada nó deve ter uma representação exclusiva de um desses conjuntos.
Uma solução será representada por um contêiner ordenado contendo representações de nós. Os nós devem ser ordenados na mesma ordem em que são transmitidos.
Um padrão será representado por um contêiner não ordenado de pares de nós. Cada par representa uma aresta começando a conectar os dois pontos no par. Representações de padrões não são exclusivas.
Você fará uma representação de padrão como entrada através de métodos de entrada padrão e produzirá todas as soluções possíveis que criam o mesmo padrão através de métodos de saída padrão.
Você pode assumir que cada entrada terá pelo menos uma solução e conectará pelo menos 4 nós.
Você pode optar por usar um contêiner solicitado no lugar de um contêiner não ordenado, se assim o desejar ou for forçado pela seleção de idioma.
Casos de teste
Com os nós organizados no seguinte padrão:
0 1 2
3 4 5
6 7 8
Seja {...}
um contêiner não ordenado, [...]
seja um contêiner solicitado e(...)
seja um par.
As seguintes entradas e saídas devem corresponder
{(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)} -> {}
Um álbum imgur de todos os casos de teste, como imagens, pode ser encontrado aqui . Os padrões estão em soluções azuis em vermelho.
Pontuação
Isso é código de golfe. Menos bytes ganha.