Visão geral
Pérolas (ou Masyu) é um jogo de lógica jogado em uma grade. Há pérolas em preto e branco colocadas na grade. O objetivo é formar um loop fechado único que viaja através de cada pérola usando apenas segmentos de linha reta e ângulos retos.
Existem algumas regras que governam como o loop interage com as pérolas:
- Pérolas brancas devem ser percorridas diretamente , mas o loop deve girar na célula anterior e / ou na próxima célula em seu caminho.
- Pérolas negras deve ser virou em cima, mas o loop deve viajar em linha reta através dos próximos e células anteriores em seu caminho.
- O loop não deve cruzar ou se cruzar. Todas as células possuem exatamente zero ou duas entradas / saídas de loop.
Um exemplo de quebra-cabeça da Wikipedia (e sua solução):
Seu objetivo é resolver um determinado quebra-cabeça. Se houver várias soluções possíveis, não importa qual você fornecer.
Entrada
A entrada será uma grade quadrada não resolvida . O exemplo mostrado acima ficaria assim:
..w.w.....
....w...b.
..b.b.w...
...w..w...
b....w...w
..w....w..
..b...w...
w...b....w
......ww..
..b......b
w
é uma pérola branca, b
é uma pérola negra e .
é uma célula vazia.
Suponha que a entrada seja válida. Isso significa que é bem formado e pelo menos uma solução é possível. Todos os quebra-cabeças válidos são pelo menos 3x3 e contêm pelo menos uma pérola.
Resultado
Saída é uma sequência de coordenadas que representam o caminho. O canto superior esquerdo da grade é 0 0
, superior direito n-1 0
, onde n é a largura da grade.
Um caminho é simplesmente uma série de coordenadas ordenadas:
x1 y1 x2 y2 x3 y3 ...
Presume-se que o caminho esteja fechado; portanto, não é necessário repetir a primeira coordenada no final, mas não há penalidade por isso.
A saída deve consistir em pelo menos todos os cantos do caminho. Você não precisa produzir todas as células no caminho se não houver uma volta. Por exemplo, a saída do exemplo pode começar com:
1 0 5 0 5 1 ...
ou
1 0 2 0 3 0 4 0 5 0 5 1 ...
A saída não deve conter nenhuma célula que não esteja no caminho. Você pode iniciar em qualquer célula do caminho.
Snippet
Aqui está um trecho que você pode usar para visualizar sua solução. Basta colar na grade em que você está trabalhando e no caminho que você produz. Estou ciente de que é doloroso olhar para o meu código, então sugiro que não;)
Casos de teste
Esses casos de teste mostram uma saída possível para cada entrada (exceto a última, que é mostrada sem solução). Pode haver outros caminhos válidos, você pode ir no sentido horário ou no sentido horário ou iniciar em um ponto diferente etc. As soluções devem ser capazes de resolver os casos de teste em segundos / minutos / horas, não em dias / semanas / éons.
...
w..
..b
0 0 1 0 2 0 2 1 2 2 1 2 0 2 0 1
.wb..b
......
..b...
w.ww..
......
b....b
0 0 2 0 2 2 4 2 4 1 3 1 3 0 5 0 5 5 3 5 3 4 4 4 4 3 1 3 1 4 2 4 2 5 0 5 0 2 1 2 1 1 0 1
.....w.b.w..
ww..b...b...
.w.....b....
...wbww..b.b
....b.......
w.w.........
..w......b.b
.....bb.....
.....b.....w
w.ww..b.....
...w......w.
b..w.....b..