Hashiwokakero ("costruisci ponti" in giapponese) è un puzzle in cui ti viene assegnato il compito di collegare un gruppo di isole con ponti. Le regole sono:
- I ponti devono correre verticalmente o orizzontalmente tra due isole.
- I ponti potrebbero non incrociarsi.
- Una coppia di isole può essere collegata al massimo da due ponti paralleli.
- Ogni isola è contrassegnata da un numero compreso tra 1 e 8, inclusi. Il numero di ponti collegati a un'isola deve corrispondere al numero su quell'isola.
- I ponti devono collegare le isole in un singolo gruppo collegato.
Il tuo compito è scrivere un programma che risolva i puzzle di Hashiwokakero.
Puoi presumere che ogni dato enigma sia risolvibile e che esista una sola soluzione.
Il programma dovrebbe essere ragionevolmente efficiente. Ad esempio, la risoluzione del puzzle 25x25 di seguito non dovrebbe richiedere più di 10 minuti su un PC medio e non dovrebbe usare più di un gigabyte di memoria. Risolvere enigmi più piccoli come quello 7x7 dovrebbe richiedere alcuni secondi.
Ingresso:
Il puzzle verrà fornito come una mappa 2D di personaggi, con le cifre 1che 8rappresentano le isole e gli spazi che rappresentano l'acqua. Le linee saranno riempite con spazi se necessario per renderle tutte della stessa lunghezza.
Le isole saranno sempre separate orizzontalmente e verticalmente da almeno un quadrato d'acqua in modo che ci sia spazio per posizionare il potenziale ponte tra di loro. Ci saranno sempre almeno due isole in un puzzle.
Il tuo programma dovrebbe preferibilmente leggere la mappa del puzzle dall'input standard, ma puoi specificare un metodo di input alternativo se il tuo linguaggio di programmazione lo richiede.
Produzione:
L'output dovrebbe essere come l'input, tranne che con gli spazi sostituiti da bridge se necessario. I ponti devono essere disegnati utilizzando i caratteri di disegno della casella Unicode ─(U + 2500), │(U + 2502), ═(U + 2550) e ║(U + 2551) per rappresentare ponti singoli e doppi orizzontali e verticali.
Se i caratteri Unicode sono un problema, è possibile utilizzare i caratteri ASCII -, |, =e Hinvece.
Criteri vincenti:
Questo è il codice golf. Vince la soluzione più breve, corretta e ragionevolmente efficiente.
Esempi:
Puzzle (7x7):
2 2 1
1 4 3
3 2
4
3 2 3
1
3 4 2
Soluzione:
2─2──1
│1──4─3
3──2║ ║
│ │4 ║
│3─2║ 3
1║ ║ │
3──4─2
Puzzle (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
Soluzione:
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 1l'inserimento?
1 1, che è un puzzle valido e deve essere gestito correttamente.