Hashiwokakero (японська мова "будувати мости") - це головоломка, де вам поставлено завдання з'єднати групу островів з мостами. Правила такі:
- Місти повинні проходити вертикально або горизонтально між двома островами.
- Мости можуть не перетинатися один з одним.
- Пара островів може бути з'єднана щонайбільше двома паралельними мостами.
- Кожен острів позначений цифрою від 1 до 8 включно. Кількість мостів, підключених до острова, повинна відповідати кількості на цьому острові.
- Мости повинні з'єднувати острови в єдину з’єднану групу.
Ваше завдання - написати програму, яка буде розгадувати загадки Hashiwokakero.
Ви можете припустити, що будь-яка задана головоломка вирішується і що існує лише одне рішення.
Програма повинна бути досить ефективною. Наприклад, розв’язання головоломки розміром 25x25 в середньому на ПК не повинно займати більше 10 хвилин, і вона не повинна використовувати більше, ніж гігабайт пам'яті. Розв’язування менших пазлів на зразок 7x7 має займати секунди.
Вхід:
Головоломка буде надана у вигляді двовимірної карти символів, з цифрами, 1що 8представляють острови, та просторами, що представляють воду. Лінії будуть прокладені пробілами, якщо необхідно, щоб вони були однакової довжини.
Острови завжди будуть розділені горизонтально і вертикально принаймні одним квадратом води, щоб між ними було місце для розміщення потенційного моста. У головоломці завжди буде принаймні два острови.
Переважно ваша програма повинна прочитати карту головоломки зі стандартного введення, але ви можете вказати альтернативний метод введення, якщо цього вимагає ваша мова програмування.
Вихід:
Вихід повинен бути як вхідний, за винятком пробілів, замінених мостами, якщо це необхідно. Містки слід намалювати за допомогою символів для малювання поля Unicode ─(U + 2500), │(U + 2502), ═(U + 2550) та ║(U + 2551) для зображення горизонтальних та вертикальних одинарних та подвійних мостів.
Якщо символи Unicode є проблемою, ви можете використовувати символи ASCII -, |, =і Hзамість цього.
Критерії виграшу:
Це код гольфу. Виграє найкоротше правильне і досить ефективне рішення.
Приклади:
Головоломка (7x7):
2 2 1
1 4 3
3 2
4
3 2 3
1
3 4 2
Рішення:
2─2──1
│1──4─3
3──2║ ║
│ │4 ║
│3─2║ 3
1║ ║ │
3──4─2
Головоломка (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
Рішення:
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 1як введення?
1 1це дійсна головоломка, і з нею слід керуватися правильно.