Hashiwokakero ("construir pontes" em japonês) é um quebra-cabeça em que você é encarregado de conectar um grupo de ilhas a pontes. As regras são:
- As pontes devem ser executadas vertical ou horizontalmente entre duas ilhas.
- Pontes não podem se cruzar.
- Um par de ilhas pode ser conectado por no máximo duas pontes paralelas.
- Cada ilha é marcada com um número entre 1 e 8, inclusive. O número de pontes conectadas a uma ilha deve corresponder ao número nessa ilha.
- As pontes devem conectar as ilhas em um único grupo conectado.
Sua tarefa é escrever um programa que resolva quebra-cabeças Hashiwokakero.
Você pode assumir que qualquer quebra-cabeça é solucionável e que existe apenas uma solução.
O programa deve ser razoavelmente eficiente. Por exemplo, resolver o quebra-cabeça 25x25 abaixo não deve demorar mais de 10 minutos em um PC comum e não deve usar mais do que um gigabyte de memória. Resolver quebra-cabeças menores como o 7x7 deve levar alguns segundos.
Entrada:
O quebra-cabeça será dado como um mapa 2D de caracteres, com os dígitos 1para 8representar as ilhas e os espaços representando a água. As linhas serão preenchidas com espaços, se necessário, para torná-las todas do mesmo comprimento.
As ilhas sempre serão separadas horizontal e verticalmente por pelo menos um quadrado de água, para que haja espaço para colocar a ponte potencial entre elas. Sempre haverá pelo menos duas ilhas em um quebra-cabeça.
Seu programa deve ler, de preferência, o mapa do quebra-cabeça a partir da entrada padrão, mas você pode especificar um método de entrada alternativo se a sua linguagem de programação exigir.
Resultado:
A saída deve ser como a entrada, exceto com espaços substituídos por pontes, conforme necessário. As pontes devem ser desenhadas usando caracteres de desenho de caixa Unicode ─(U + 2500), │(U + 2502), ═(U + 2550) e ║(U + 2551) para representar pontes simples e duplas horizontais e verticais.
Se os caracteres Unicode são um problema, você pode usar os caracteres ASCII -, |, =e Hem vez disso.
Critérios de vitória:
Isso é código de golfe. A menor solução correta e razoavelmente eficiente vence.
Exemplos:
Quebra-cabeça (7x7):
2 2 1
1 4 3
3 2
4
3 2 3
1
3 4 2
Solução:
2─2──1
│1──4─3
3──2║ ║
│ │4 ║
│3─2║ 3
1║ ║ │
3──4─2
Quebra-cabeça (25x25):
2 2 2 2 1 1 2 2 2 2 2
1 3 5 4 4 2
2 2 4 5 5 4 2 2 1 3
2 1 1 3 3 2 2
3 4 4 4 4 5 4 3 2 3
2 4 5 4 2 3
2 1 4 2 4 3 1 1 2
2 1 3 1 1 6 4 2
3 2 4 3 6 3 2
2 2 3 3 2 5 2 4 3
2 1 1 2
1 3 3 3 3 5 8 7 6 5 4
2 3 1 1 2
1 1 5 1 4 5 6 3 1 2
1 1 2 2 3 4
3 5 4 4 3 3 8 7 5 1 2
2 3 1 2 2 1 1
2 2 2 2 5 7 6 3 3
3 3 6 3 5 3 2 2 2 3
2 1 2 3 2 2
3 4 6 4 5 5 3 3 5 1
2 1 2 2 1 1 3
2 1 1 2 3 6 5 2 2
2 3 4 4 4 2 1
2 2 2 2 2 2 2 1 1 3 2
Solução:
2─2─2──2 1 1─2─2──2──2─2
│ │ │1─3═5══4══4─2│
2 2─4─5══5═4═2│2──1 │ │3
│ 2│ ║1│ 1─3═3─2│ │ 2║
│ ║3═4│4══4─4═5─4─3──2 │3
2 4═5─4│ │ │ ║ │ │2───3│
│2─1║ ║4─2│ 4─3 │ 1│ 1 │2
2│1─3 ║║ │1 ║1──6══4 │ 2│
│3─2──4║ 3══6─3 ║ │ │ │2
2│2═3 │3──2 │ ║ 5─2│ 4─3│
│2─1│ │ │ │ ║ ║ │1 ║ │2
│ 1─3─3─3─3─5═8═7═6──5═4│
2──3───1│1─2│ ║ │ ║ ││
1 │ 1──5─1││ 4─5─6─3─1│2
1│ │1──2║ │2 │ ║ ║ │3═4│
│3─5═4 │4──3│ 3═8═7═5│1│2
2│ │ ║ 3│ 1│2──2║ │ ║1│1│
│2 │ ║ ║2 │2──2│5═7═6─3─3
3│ 3─6─3│ 5═3 │2│ ║2│2─3│
║2 │ ║ │ ║ │ 1│2─3║2│ ║2
3│ 4═6──4─5─5──3─3─5││1║│
│2 │ │1 │ │2║2──1│ ║1││3│
2│ │ 1│ │ 1║2│3══6═5─2││2
│2─3──4═4──4─2│ │ │1│
2─2──2─2──2─2─2 1 1─3─2
1 1entrada?
1 1, que é válido e deve ser manuseado corretamente.