O jogo
Recentemente, muito do meu tempo foi ocupado por um jogo viciante no meu telefone, chamado Logic Dots, que me inspirou a escrever esse desafio. É mais fácil explicar as regras se eu mostrar a tela do jogo, então aqui está uma captura de tela de um quebra-cabeça não resolvido e resolvido:
Agora aqui, há três coisas principais a serem observadas.
- O tabuleiro de jogo (a grade 4x4 de quadrados no centro)
- As formas necessárias (os pontos vinculados na segunda barra da parte superior, sob a partitura e o menu etc.), que são todas as linhas ou
a
por 1 retângulo - Os números nas linhas e colunas, que indicam quantos pontos precisam estar na coluna, para uma solução
O objetivo do jogo é ajustar as formas necessárias na grade. Você pode girar as formas, mas elas não podem entrar na diagonal.
Na solução, observe que todas as formas são criadas exatamente uma vez (porque estão apenas nas formas necessárias uma vez) e, nesse caso, são todas horizontais, mas também podem ser verticais. Os quadrados preenchidos em rosa indicam os quadrados não utilizados.
Aqui está uma grade maior e um pouco mais complicada:
Observe que no quebra-cabeça não resolvido, já existem alguns quadrados preenchidos. Os quadrados acinzentados significam quadrados bloqueados nos quais você NÃO PODE colocar um ponto. Os pontos com rabos informam que um ponto está naquele ponto e se vincula a pelo menos mais um ponto na direção da cauda, mas não em nenhuma outra direção (incluindo a direção oposta).
Notação
No restante deste post, vou me referir ao quadro usando os seguintes símbolos:
- <,>, ^, v - Significa um ponto pré-colocado com uma cauda estendida na direção do ponto
- * - significa um ponto. Se fornecido em uma grade não resolvida (entrada), é uma forma individual. Se estiver na saída, ele será conectado aos pontos ao seu redor.
- # - Significa um quadrado da grade bloqueado (onde você não pode colocar um ponto)
- -, | (hífen e barra) - significa um ponto com a cauda direita e esquerda e um ponto com a cauda para cima e para baixo, respectivamente
- ** (caractere de espaço) - ** Significa um espaço vazio
Usando esses símbolos, o último caso de exemplo (não resolvido) pode ser representado da seguinte maneira:
<
#
^ #
E a solução pode ser representada como:
*< * *
*
*
* *
* *#*
^ # *
Observe que duas formas não podem tocar na horizontal, na vertical ou na diagonal , portanto, o seguinte caso não é válido:
***
**
**
Desafio
Seu desafio é resolver qualquer quebra-cabeça de pontos lógicos, de 4x4 a 9x9, inclusive. Você receberá quatro linhas de entrada, depois o tabuleiro do jogo. As linhas serão as seguintes:
- 1ª linha, Formas - As formas a serem encontradas, cada uma dada na forma
sizexquantity
(por exemplo,3x2
para duas formas de comprimento três) e separadas por um espaço. Linha de exemplo:3x1 2x1 1x1
- 2ª linha, Colunas - Uma lista separada por espaços da contagem de pontos necessária para cada coluna. Linha de exemplo:
1 1 2 2
- 3ª linha, Linhas - Uma lista separada por espaços da contagem de pontos necessária para cada linha. Linha de exemplo:
3 0 3 0
- 4ª linha, tamanho da placa - um único número inteiro, o tamanho da placa,
B
O quadro é fornecido e são B
linhas de entrada que representam o quadro usando a notação mencionada acima. Por exemplo, a entrada completa para o último caso de exemplo é a seguinte:
4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
<
#
^ #
Seu programa produzirá a placa resolvida, na mesma notação. A saída correspondente para a entrada acima é a seguinte:
** * *
*
*
* *
* *#*
* # *
Observe que um tabuleiro de jogo pode ter várias soluções. Nesse caso, basta gerar uma solução válida. Além disso, seu programa deve produzir uma solução correta em 10 segundos em um computador de mesa razoável para uma grade 10x10 complicada.
Isso é código de golfe, então o mínimo de bytes vence.
Casos de teste
Entrada 1
3x2 1x4
2 2 3 1 2
4 0 3 0 3
5
#
#
*
Saída 1
*** *
***#
#
* * *
Entrada 2
3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*
#
Saída 2
* * *
*
* *
* #
* *
Entrada 3
5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#
-
#
<
Saída 3
#
*****
****
#
* ** *
t no two shapes can touch horizontally, vertically or diagonally
(isto deve estar no início, não perdeu quase perto do final, mas de qualquer maneira ...)