Introdução
Por muitos séculos, houve um determinado rio que nunca foi mapeado. A Guilda dos Cartógrafos quer produzir um mapa do rio, no entanto, eles nunca conseguiram ter sucesso - por alguma razão, todos os cartógrafos que enviaram para mapear o rio foram comidos por animais selvagens na área. É necessária uma abordagem diferente.
Descrição da entrada
A área é uma grade retangular de células de comprimento m
e largura n
. A célula no canto inferior esquerdo seria 0,0
e a célula no canto superior direito seria m-1,n-1
. m
e n
são fornecidos na entrada como uma tupla m,n
.
Usando técnicas de som geográfico de longa distância, a localização das ilhas ao redor do rio foi identificada. O tamanho das ilhas (ou seja, quantas células a ilha ocupa) também foi identificado, mas a forma não. Nós fornecemos essas informações em uma tupla s,x,y
onde s
está o tamanho da ilha x
e y
são as posições x e y de uma célula específica dessa ilha. Cada tupla na entrada é separada por espaço, então aqui está um exemplo de entrada:
7,7 2,0,0 2,3,1 2,6,1 2,4,3 2,2,4 8,0,6 1,2,6 3,4,6
Para ilustrar mais claramente, aqui está a entrada em um gráfico:
y 6|8 1 3
5|
4| 2
3| 2
2|
1| 2 2
0|2
=======
0123456
x
Descrição da saída
Saída de um mapa usando caracteres ASCII para representar partes da área. Cada célula será #
(terra) ou .
(água). O mapa deve seguir estas regras:
- Definição. Uma ilha é um grupo ortogonalmente contíguo de células terrestres que é delimitado inteiramente por células do rio e / ou pela borda da área.
- Definição. Um rio é um grupo ortogonalmente contíguo de células de água que é delimitado inteiramente por células terrestres e / ou pela borda da área e não contém "lagos" (áreas 2x2 de células de água).
- Regra . O mapa deve conter exatamente um rio.
- Regra . Cada célula numerada na entrada deve fazer parte de uma ilha contendo exatamente
s
células. - Regra . Cada ilha no mapa deve conter exatamente uma das células numeradas na entrada.
- Regra . Existe um único mapa exclusivo para cada entrada.
Aqui está a saída da entrada de exemplo:
#.#.##.
#....#.
#.##...
##..##.
###....
...##.#
##....#
Aqui está outra entrada e saída.
Entrada:
5,5 3,0,1 1,4,1 2,0,4 2,2,4 2,4,4
Saída:
#.#.#
#.#.#
.....
###.#
.....
fonte
javascript:(_=>{var t=Game.nurikabe().task,m=t.length,n=t[0].length,s=[m,n];for(var i=0;i<m;i++)for(var j=0;j<n;j++)if(t[i][j]>=0)s+=' '+[t[i][j],i,j];puzzleContainerDiv.insertAdjacentHTML('beforeend','<hr><tt style=color:red>'+s+'</tt><hr>')})();void(0)
Respostas:
C + PicoSAT ,
2345995952 bytesExperimente online!
(Aviso: esse link do TIO é um URL de 30 kilobytes que contém uma cópia reduzida do PicoSAT 965, portanto, talvez você não consiga carregá-lo em alguns navegadores, mas carregue pelo menos no Firefox e no Chrome.)
Como funciona
Inicializamos o solucionador SAT com uma variável para cada célula (terra ou água) e apenas as seguintes restrições:
O restante das restrições é difícil de codificar diretamente no SAT; portanto, executamos o solucionador para obter um modelo, executamos uma sequência de pesquisas profundas para encontrar as regiões conectadas desse modelo e adicionamos restrições adicionais, como a seguir:
Aproveitando a interface incremental da biblioteca PicoSAT, podemos executar novamente o solucionador imediatamente, incluindo as restrições adicionadas, preservando todas as inferências anteriores feitas pelo solucionador. O PicoSAT nos fornece um novo modelo e continuamos repetindo as etapas acima até que a solução seja válida.
Isso é notavelmente eficaz; resolve instâncias 15 × 15 e 20 × 20 em uma pequena fração de segundo.
(Agradecemos a Lopsy por sugerir essa ideia de restringir interativamente as regiões conectadas em um solucionador incremental de SAT, há um tempo.)
Alguns casos de teste maiores do puzzle-nurikabe.com
Uma página aleatória de quebra-cabeças rígidos 15 × 15 ( 5057541 , 5122197 , 5383030 , 6275294 , 6646970 , 6944232 ):
Uma página aleatória de 20 × 20 quebra-cabeças normais ( 536628 , 3757659 ):
fonte
GLPK , (não concorrente) 2197 bytes
Esta é uma entrada não concorrente, pois
Vou salvar uma versão ainda não-gasta e funcional aqui. Dependendo do feedback, posso tentar reduzi-lo + adicionar uma explicação, se houver interesse. Até o momento, os nomes das restrições servem como documentos no local.
A idéia principal é codificar a restrição "ilhas contíguas", introduzindo uma variável de fluxo preservada que possui uma fonte pré-especificada no local da dica. A variável de decisão, em
is_island
seguida, desempenha o papel de pias posicionáveis. Ao minimizar a soma total desse fluxo, as ilhas são forçadas a permanecer conectadas no ideal. As outras restrições implementam diretamente as várias regras. O que me intriga e que ainda pareço precisarisland_fields_have_at_least_one_neighbor
.O desempenho desta formulação não é ótimo, no entanto. Ao comer diretamente toda a complexidade com uma grande quantidade de restrições, o solucionador leva quase 15 segundos para o exemplo 15 x 15.
Código (ainda não destruído)
Dados do problema
5 x 5
7 x 7
15 x 15
Uso
Já
glpsol
instalado, modelo como um arquivo (por exemploriver.mod
), os dados de entrada em arquivo separado (s) (por exemplo7x7.mod
). Então:Isso, mais alguma paciência, imprimirá a solução no formato de saída especificado (junto com "alguma" saída de diagnóstico).
fonte
Python 3 , 1295 bytes
Esta é uma solução apenas para python. Ele não usa bibliotecas e carrega a placa através da entrada padrão. Mais explicações por vir. Esta é a minha primeira tentativa de um golfe tão grande. Há um link para o código comentado e sem golfe na parte inferior.
Experimente online!
Veja o código não golfe .
fonte