Недавно я познакомился с игрой-головоломкой, известной как шахматы-пасьянсы . Я обобщу правила здесь:
- Доска - шахматная доска 4х4.
- Все фигуры одного цвета (без команд), и все фигуры могут захватывать любые другие фигуры.
- Каждое движение должно быть захватом. Нет перемещения на пустые квадраты.
- В конце должна быть ровно одна часть.
- Все фигуры движутся точно так же, как в шахматах, с одной модификацией: пешка может захватывать в любом диагональном направлении (что технически делает ее ферзом ). Для тех, кто не знает, я включил диаграммы движения.
- Ни одно из других шахматных правил (таких как проверка, рокировка и т. Д.) Здесь не применимо. Это все о захвате.
Король (K)
K * . . | * K * . | * * * .
* * . . | * * * . | * K * .
. . . . | . . . . | * * * .
. . . . | . . . . | . . . .
Королева (Q)
Q * * * | * Q * * | * * * .
* * . . | * * * . | * Q * *
* . * . | . * . * | * * * .
* . . * | . * . . | . * . *
Ладья (R)
R * * * | * R * * | . * . .
* . . . | . * . . | * R * *
* . . . | . * . . | . * . .
* . . . | . * . . | . * . .
Епископ (B)
B . . . | . B . . | * . * .
. * . . | * . * . | . B . .
. . * . | . . . * | * . * .
. . . * | . . . . | . . . *
Рыцарь (N)
N . . . | . N . . | . . . *
. . * . | . . . * | . N . .
. * . . | * . * . | . . . *
. . . . | . . . . | * . * .
Пешка (P)
P . . . | . P . . | * . * .
. * . . | * . * . | . P . .
. . . . | . . . . | * . * .
. . . . | . . . . | . . . .
Ввод, вывод
Для справки будет использован образец головоломки с веб-страницы Solitaire Chess:
. . . .
. B . .
R P . .
. . . N
Решение состоит в том, чтобы взять пешку с конем, затем взять коня ладьей и, наконец, взять слона ладьей.
вход
Ввод должен быть в одной из трех форм; Вы можете выбрать тот, который наиболее удобен для вас.
- Строка символов, например
.....B..RP.....N
, с или без символов новой строки. Символ, представляющий пробел, может быть любым символом, который не является одним изKQRBNP
. - Список списков (или плоский список), где элементы являются символами или числами, например так:
[['.', '.', '.', '.'], ['.', 'B', '.', '.'], ['R', 'P', '.', '.'], ['.', '.', '.', 'N']]
или[[0, 0, 0, 0], [0, 4, 0, 0], [3, 6, 0, 0], [0, 0, 0, 5]]
. В первом случае символ, представляющий пробел, может быть чем угодноKQRBNP
. Для последних я дал фигурам номер, соответствующий их рангу, в моем раннем списке ходов (1
король,4
слон,6
пешка и т. Д.). Вы можете изменить нумерацию. - Список координат , где каждый элемент имеет форму
[x, y, 'c']
, например , так:[[1, 2, 'B'], [0, 1, 'R'], [1, 1, 'P'], [3, 0, 'N']]
.
Если вы выберете один из форматов ввода на основе списка, разделители и разделители могут быть любыми разумными и понятными символами.
Выход
Выходные данные должны быть последовательностью ходов или последовательностью состояний доски. Некоторые головоломки имеют более одного решения; Вы можете вывести один или все из них. Если вы решите вывести последовательность состояний платы, каждая плата должна быть в одном из трех форматов ввода с разумным разделителем (таким как переводы строк) между ними.
Если вы решили выводить последовательность ходов, они должны быть выражены в виде списка пар координатных пар, например , так: [[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
. [0,0]
представляет нижний левый угол, и опять же, разделение и разделение символов могут быть любым разумным выбором.
Если данная доска не может быть решена, выведите любое ложное значение ( 0
пустая строка и т. Д.). Если на данной доске меньше двух фигур, поведение не определено.
Тестовые случаи
Примечание: выходные данные приведены только в виде списка пар координат, поскольку другие форматы довольно легко проверить на корректность (и мне не хотелось печатать все возможные выходные форматы). Кроме того, для головоломок, которые имеют более одного решения, предоставляется только одна возможность.
Вход 1:
. . . N
. . . .
. R . .
. . B .
...N.....R....B.
[['.', '.', '.', 'N'], ['.', '.', '.', '.'], ['.', 'R', '.', '.'], ['.', '.', 'B', '.']]
[[0, 0, 0, 5], [0, 0, 0, 0], [0, 3, 0, 0], [0, 0, 4, 0]]
[[3, 3, 'N'], [1, 1, 'R'], [2, 0, 'B']]
Выход 1:
[[[2,0], [1,1]], [[1,1], [3,3]]]
Вход 2:
. . . .
. B . .
R P . .
. . . N
.....B..RP.....N
[['.', '.', '.', '.'], ['.', 'B', '.', '.'], ['R', 'P', '.', '.'], ['.', '.', '.', 'N']]
[[0, 0, 0, 0], [0, 4, 0, 0], [3, 6, 0, 0], [0, 0, 0, 5]]
[[1, 2, 'B'], [0, 1, 'R'], [1, 1, 'P'], [3, 0, 'N']]
Выход 2:
[[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
Вход 3:
. N R .
B . . .
N . . B
. . P .
.NR.B...N..B..P.
[['.', 'N', 'R', '.'], ['B', '.', '.', '.'], ['N', '.', '.', 'B'], ['.', '.', 'P', '.']]
[[0, 5, 3, 0], [4, 0, 0, 0], [5, 0, 0, 4], [0, 0, 6, 0]]
[[1, 3, 'N'], [2, 3, 'R'], [0, 2, 'B'], [0, 1, 'N'], [3, 1, 'B'], [2, 0, 'P']]
Выход 3:
[[[2,0], [3,1]], [[0,1], [1,3]], [[0,2], [1,3]], [[2,3], [1,3]], [[3,1], [1,3]]]
Вход 4:
. . . N
. . . R
R B B .
N P P .
...N...RRBB.NPP.
[['.', '.', '.', 'N'], ['.', '.', '.', 'R'], ['R', 'B', 'B', '.'], ['N', 'P', 'P', '.']]
[[0, 0, 0, 5], [0, 0, 0, 3], [3, 4, 4, 0], [5, 6, 6, 0]]
[[3, 3, 'N'], [3, 2, 'R'], [0, 1, 'R'], [1, 1, 'B'], [2, 1, 'B'], [0, 0, 'N'], [1, 0, 'P'], [2, 0, 'P']]
Выход 4:
[[[2,1], [3,2]], [[1,1], [3,3]], [[3,2], [1,0]], [[3,3], [0,0]], [[0,1], [0,0]], [[0,0], [1,0]], [[1,0], [2,0]]]
Вход 5:
P . . .
. R . .
R . R .
. R . .
P....R..R.R..R..
[['P', '.', '.', '.'], ['.', 'R', '.', '.'], ['R', '.', 'R', '.'], ['.', 'R', '.', '.']]
[[6, 0, 0, 0], [0, 3, 0, 0], [3, 0, 3, 0], [0, 3, 0, 0]]
[[0, 3, 'P'], [1, 2, 'R'], [0, 1, 'R'], [2, 1, 'R'], [1, 0, 'R']]
Выход 5:
[[[0,3], [1,2]], [[1,2], [2,1]], [[2,1], [1,0]], [[1,0], [0,1]]]
Вход 6:
. P . N
K . . .
. . B .
. . R Q
.P.NK.....B...RQ
[['.', 'P', '.', 'N'], ['K', '.', '.', '.'], ['.', '.', 'B', '.'], ['.', '.', 'R', 'Q']]
[[0, 6, 0, 5], [1, 0, 0, 0], [0, 0, 4, 0], [0, 0, 3, 2]]
[[1, 3, 'P'], [3, 3, 'N'], [0, 2, 'K'], [2, 1, 'B'], [2, 0, 'R'], [3, 0, 'Q']]
Выход 6:
[[[3,0], [2,0]], [[2,0], [2,1]], [[3,3], [2,1]], [[2,1], [1,3]], [[0,2], [1,3]]]
[["R", [2, 0], [1, 1]], ["N", [1, 1], [3, 3]]]
Ответы:
Haskell,
226195191188 байтВозвращает список всех решений. Каждое решение представляет собой список ходов. Возвращает пустой список, если нет решения.
Сохранено 4 байта благодаря Линн.
Попробуйте онлайн
Использование:
Выход:
источник
!
сохраняет несколько байтов:f l=[(i,j):r|(i@(s,t),a)<-l,(j@(u,v),_)<-l%i,r<-f$(j,a):l%i%j,(s-u)^2+(t-v)^2`elem`m a]
[[((2,0),(1,1)),((1,1),(3,3))]]
, Список решений, где решение - это список ходов, где находится ход((x1,y1),(x2,y2))
.m"P"=[1]
Разве это не должно быть 2?Javascript (ES6),
372361358 байтЭто (все еще) нуждается в некоторой оптимизации. Но вот
первая2-я3-я попытка.Выходной формат:
Пример:
источник