Um meandro de preenchimento de grade é um caminho fechado que visita todas as células de uma grade quadrada pelo menos uma vez, nunca cruzando nenhuma borda entre células adjacentes mais de uma vez e nunca cruzando a si próprio. Por exemplo:
Uma vez preenchidas, cada célula da grade pode ser representada por um dos 8 blocos a seguir:
Numerados dessa maneira, os ladrilhos do meandro acima podem ser representados por esta matriz:
5 6 5 6
4 8 3 2
5 7 6 2
4 3 4 3
Sua tarefa é concluir um meandro de preenchimento de grade, devido a um conjunto incompleto de peças. Por exemplo, o meandro incompleto:
... que pode ser representado usando 0
s para blocos ausentes:
5 0 0 0 6
0 0 7 0 0
0 0 0 0 3
2 4 0 0 0
0 0 3 0 0
... poderia ser concluído assim:
... ou seja:
5 6 5 1 6
4 8 7 6 2
5 7 7 7 3
2 4 8 8 6
4 1 3 4 3
Especificações
- A entrada sempre terá pelo menos e, no máximo , blocos (não vazios), onde .
- Você pode usar qualquer conjunto de valores para representar os blocos, desde que especificados em sua resposta.
- Sua entrada e saída podem estar em qualquer formato e ordem, desde que especificadas na sua resposta.
- Pelo menos uma solução válida existirá para todas as entradas (ou seja, você não precisa lidar com entradas inválidas).
- Aplicam- se as regras de E / S padrão .
- As brechas padrão são proibidas.
- Explicações, mesmo para idiomas "práticos", são incentivadas.
Casos de teste
Entrada ( Θ ):
0 6 0 0
Saída ( Θ ):
5 6 4 3
Entrada ( Θ ):
5 6 5 6 4 0 3 2 5 7 6 2 4 3 4 3
Saída ( Θ ):
5 6 5 6 4 8 3 2 5 7 6 2 4 3 4 3
Entrada ( Θ ):
5 0 0 0 6 0 0 7 0 0 0 0 0 0 3 2 4 0 0 0 0 0 3 0 0
Saída ( Θ ):
5 6 5 1 6 4 8 7 6 2 5 7 7 7 3 2 4 8 8 6 4 1 3 4 3
code-golf
grid
graph-theory
Jordânia
fonte
fonte
Respostas:
JavaScript (ES7),
236 ... 193185 bytesSaídas modificando a matriz de entrada.
Experimente online!
(inclui algum código de pós-processamento para imprimir o resultado como uma matriz e como uma lista simples compatível com a ferramenta de visualização fornecida pelo OP)
Resultados
Quão?
Variáveis
Verificações iniciais
Por enquanto, vamos supor que não estamos de volta ao ponto de partida.
Procurando um caminho
As conexões de bloco são codificadas em uma tabela de pesquisa, cujo índice é calculado comn d d
As últimas 8 entradas são inválidas e omitidas. As outras 4 entradas inválidas são explicitamente marcadas com hífens.
Para referência, abaixo estão a tabela decodificada, a bússola e o conjunto de peças fornecidas no desafio:
Fazemos uma chamada recursiva parag com a nova direção e as novas coordenadas. Nós adicionamos 1 / 2 para v se estivéssemos em uma telha do tipo 7 8 1
Sed x y
Validando o caminho
Por fim, quando voltarmos a( 0 , 0 ) v > 0
Cada bloco deve ser visitado uma vez, exceto os blocos7 e 8 que devem ser visitados duas vezes. É por isso que adicionamos apenas1 / 2 v
Daí o código JS:
Fonte formatada
fonte