Игра
В последнее время большую часть моего времени занимала увлекательная игра на моем телефоне под названием «Логические точки», которая вдохновила меня на написание этой задачи. Проще объяснить правила, если я покажу вам игровой экран, поэтому вот скриншот нерешенной и решенной головоломки:
Теперь здесь есть три основных момента, на которые следует обратить внимание.
- Игровое поле (сетка квадратов 4х4 в центре)
- Требуемые фигуры (связанные точки во втором столбце сверху, под партитурой и меню и т. Д.), Которые представляют собой все линии или
a
по 1 прямоугольнику - Числа в строках и столбцах, обозначающие количество точек в столбце для решения
Цель игры состоит в том, чтобы вписать нужные фигуры в сетку. Вы можете вращать фигуры, но они не могут войти по диагонали.
В решении обратите внимание, что все фигуры создаются ровно один раз (потому что они только в требуемых фигурах один раз), и в этом случае все они горизонтальны, но они также могут быть вертикальными. Розовые квадраты, обозначенные квадратами, обозначают неиспользуемые квадраты.
Вот более крупная и немного более сложная сетка:
Обратите внимание, что в нерешенной головоломке уже заполнено несколько квадратов. Серые квадраты означают заблокированные квадраты, на которые вы НЕ МОЖЕТЕ поставить точку. Точки с хвостами говорят вам, что точка находится в этом месте, и она связана по крайней мере с еще одной точкой в направлении хвоста, но не в любом другом направлении (включая противоположное направление).
нотация
В оставшейся части этого поста я буду ссылаться на доску, используя следующие символы:
- <,>, ^, v - обозначает предварительно установленную точку с хвостом, идущим в направлении точки
- * - обозначает точку. Если задано на нерешенной сетке (вход), это индивидуальная форма. Если на выходе, то это связано с точками вокруг него.
- # - обозначает заблокированный квадрат сетки (где вы не можете поместить точку)
- -, | (дефис и полоса) - обозначает точку с правым и левым хвостом и точку с хвостом вверх и вниз соответственно
- ** (пробел) - ** Обозначает пустой пробел
Используя эти символы, последний пример (нерешенный) может быть представлен следующим образом:
<
#
^ #
И решение может быть представлено как:
*< * *
*
*
* *
* *#*
^ # *
Обратите внимание, что две фигуры не могут соприкасаться по горизонтали, вертикали или диагонали , поэтому следующий случай недопустим:
***
**
**
Вызов
Ваша задача - решить любую головоломку с логическими точками, от 4x4 до 9x9 включительно. Вы получите четыре строки ввода, затем игровое поле. Строки будут следующими:
- 1-я строка, фигуры - фигуры, которые нужно найти, каждая из которых дана в форме
sizexquantity
(например,3x2
для двух фигур длиной три) и разделена пробелом. Пример строки:3x1 2x1 1x1
- 2-я строка, Столбцы - разделенный пробелами список необходимого количества точек для каждого столбца. Пример строки:
1 1 2 2
- 3-я строка, Rows - разделенный пробелами список необходимого количества точек для каждой строки. Пример строки:
3 0 3 0
- 4-я строка, размер доски - одно целое число, размер доски,
B
Затем дается доска, и это B
строки ввода, представляющие доску с использованием обозначений, упомянутых выше. Например, полный ввод для последнего примера приведен ниже:
4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
<
#
^ #
Ваша программа затем выведет решенную плату в той же записи. Соответствующий вывод для вышеуказанного ввода выглядит следующим образом:
** * *
*
*
* *
* *#*
* # *
Обратите внимание, что игровое поле может иметь несколько решений. В этом случае просто выведите одно правильное решение. Кроме того, ваша программа должна вывести правильное решение в течение 10 секунд на приемлемом настольном компьютере для сложной сетки 10x10.
Это код гольф, поэтому выигрывает минимум байтов.
Тестовые случаи
Вход 1
3x2 1x4
2 2 3 1 2
4 0 3 0 3
5
#
#
*
Выход 1
*** *
***#
#
* * *
Вход 2
3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*
#
Выход 2
* * *
*
* *
* #
* *
Вход 3
5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#
-
#
<
Выход 3
#
*****
****
#
* ** *
t no two shapes can touch horizontally, vertically or diagonally
(это должно быть в начале, не потеряно почти в конце, но все равно ...)