Um conjunto de dominós consiste em blocos com dois números, de modo que todas as combinações de números inteiros de 0 a N sejam representadas. Os exemplos abaixo se referem a N = 6 por conveniência, mas N = 9 e N = 12 também são comuns. A orientação das telhas não importa (eles são normalmente impressas com pontos em vez de dígitos), então [1-6]
e [6-1]
se referem à mesma telha, de que há apenas uma em um conjunto.
A maioria dos jogos disputados com dominó envolve jogadores que se revezam adicionando dominó a uma linha daqueles já jogados na mesa, de modo que um dos números no novo dominó seja colocado adjacente ao mesmo número em uma extremidade da linha na mesa. Assim, você pode adicionar um [2-5]
a qualquer extremidade de uma linha existente de [2-3][3-3][3-5]
, produzindo [5-2][2-3][3-3][3-5]
ou [2-3][3-3][3-5][5-2]
.
Muitos desses jogos exigem "duplos", dominós com dois do mesmo número, para serem colocados perpendicularmente aos outros dominós conectados a eles. Além da pontuação com a qual não estamos preocupados aqui, isso não tem efeito, exceto quando ...
Muitos desses jogos permitem que a "linha" bifurque-se em algumas ou todas as duplas. Five Up é um jogo em que a linha pode se dividir em três novas linhas em cada dupla, para que todos os quatro lados de uma dupla possam ter um dominó correspondente.
Aqui está um exemplo de layout de dominó de um jogo "double 6" em um jogo de Five Up (onde A | B ou AB é um único dominó):
4
-
0
3|0 0|0 0|2
0
-
1
4|1 1|1 1|6
3
1 -
- 6
5
6
6|5 5|5 5|0 0|6 - 6|2 2|1
6
5
- 6
4 -
4
Sua tarefa é pegar uma lista de dominós na ordem em que foram adicionados à tabela e determinar se essa ordem representa ou não um jogo legal do Five Up.
Você pode escrever um programa inteiro que recebe a entrada do stdin ou uma função que recebe a entrada como um ou mais parâmetros.
A entrada canônica seria uma lista ou matriz de duas tuplas de números inteiros. Uma lista de listas, matriz de matrizes, vetor de tuplas etc. são todas formas válidas para receber entradas, como seria uma string que representa qualquer uma das anteriores ou várias strings. A entrada conterá apenas pares de números inteiros não negativos, dominós válidos.
A saída deve ser um valor verdadeiro ou falso, para jogos válidos e inválidos, respectivamente.
Seu código deve aceitar números de dominó arbitrariamente grandes, dentro dos recursos dos valores máximos inteiros do seu idioma.
Exemplos:
0-6
é válido, assim como qualquer outro dominó0-6 6-0
não é válido, existe apenas um0-6
dominó em um conjunto6-6 6-5 5-3 3-0
é válido, um arranjo linear simples6-6 6-5 3-0 5-3
não é válido, não há3
ou0
em jogo para o terceiro dominó se conectar antes de5-3
ser jogado1-1 1-2 1-3 1-4 1-5 1-6
não é válido, todas as quatro1
extremidades abertas são usadas, deixando nenhum lugar para conectar o1-6
1-1 1-2 1-3 1-4 1-5 3-6 1-6
é válido, o 3-6 se conecta ao 1-3, e o 1-6 pode se conectar ao 3-65-5 5-4 5-0 0-6 6-6 6-4 6-2 2-1 6-3 5-1 1-1 1-6 4-1 1-0 0-0 2-0 3-0 0-4
é válido, o exemplo ilustrado acima12-12 12-1 3-12 3-1 1-2 3-3
é válido, usa dominós maiores e tem um posicionamento ambíguo
OBSERVAÇÃO: A função necessária aqui não é uma verificação perfeita para jogos Five Up válidos. Estamos ignorando aqui as regras sobre qual dominó é jogado primeiro, o que exigiria mais informações sobre a variante do jogo e o número de jogadores e desqualificaria uma minoria significativa de insumos.