Hashiwokakero («строить мосты» на японском языке) - это головоломка, в которой вам поручено соединить группу островов с мостами. Правила таковы:
- Мосты должны проходить вертикально или горизонтально между двумя островами.
- Мосты не могут пересекаться друг с другом.
- Пара островов может быть соединена не более чем двумя параллельными мостами.
- Каждый остров обозначен номером от 1 до 8 включительно. Количество мостов, соединенных с островом, должно соответствовать количеству на этом острове.
- Мосты должны соединять острова в единую связанную группу.
Ваша задача - написать программу, которая будет решать головоломки Hashiwokakero.
Вы можете предположить, что любая заданная головоломка разрешима и что существует только одно решение.
Программа должна быть достаточно эффективной. Например, решение головоломки размером 25x25, представленной ниже, не должно занимать более 10 минут на среднем ПК и не должно занимать более гигабайта памяти. Решение небольших головоломок, таких как 7x7, занимает несколько секунд.
Входные данные:
Головоломка будет предоставлена в качестве карты 2D символов, с цифрами 1
на 8
представляющих острова, и пространств , представляющих воду. Строки будут дополнены пробелами, если необходимо, чтобы они были одинаковой длины.
Острова всегда будут разделены по горизонтали и вертикали как минимум одним квадратом воды, чтобы между ними было место для размещения потенциального моста. В головоломке всегда будет как минимум два острова.
Желательно, чтобы ваша программа считывала карту головоломки из стандартного ввода, но вы можете указать альтернативный метод ввода, если этого требует ваш язык программирования.
Выход:
Выходные данные должны быть такими же, как входные, за исключением случаев, когда пробелы заменяются мостами по мере необходимости. Мосты должны быть нарисованы с использованием символов рисования Unicode box ─
(U + 2500), │
(U + 2502), ═
(U + 2550) и ║
(U + 2551) для представления горизонтальных и вертикальных одинарных и двойных мостов.
Если символы Unicode являются проблемой, вы можете использовать символы ASCII -
, |
, =
и H
вместо этого.
Критерии победы:
Это код гольф. Победит самое короткое правильное и достаточно эффективное решение.
Примеры:
Головоломка (7х7):
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
Головоломка (25х25):
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
, которая является действительной головоломкой, и с ней нужно обращаться правильно.