Нещодавно мене познайомили з головоломкою, відомою під назвою Solitaire Chess . Я підсумую тут правила:
- Дошка - шашка 4x4.
- Всі шматки однакового кольору (без команд), і всі шматки можуть захоплювати будь-яку іншу частину.
- Кожен хід повинен бути захопленням. Жодного переміщення на порожні квадрати.
- На кінці повинен залишитися рівно один шматок.
- Усі шматки рухаються точно так само, як це роблять у шахах, з однією модифікацією: пішак може захоплювати в будь-якому діагональному напрямку (що технічно робить це ферзом ). На користь тих, хто може не знати, я включив схеми руху.
- Тут не застосовується жодне з інших правил шахів (наприклад, перевірка, бродіння тощо). Вся справа в захопленнях.
Кінг (К)
K * . . | * K * . | * * * .
* * . . | * * * . | * K * .
. . . . | . . . . | * * * .
. . . . | . . . . | . . . .
Королева (Q)
Q * * * | * Q * * | * * * .
* * . . | * * * . | * Q * *
* . * . | . * . * | * * * .
* . . * | . * . . | . * . *
Ладья (R)
R * * * | * R * * | . * . .
* . . . | . * . . | * R * *
* . . . | . * . . | . * . .
* . . . | . * . . | . * . .
Єпископ (Б)
B . . . | . B . . | * . * .
. * . . | * . * . | . B . .
. . * . | . . . * | * . * .
. . . * | . . . . | . . . *
Лицар (N)
N . . . | . N . . | . . . *
. . * . | . . . * | . N . .
. * . . | * . * . | . . . *
. . . . | . . . . | * . * .
Пішак (P)
P . . . | . P . . | * . * .
. * . . | * . * . | . P . .
. . . . | . . . . | * . * .
. . . . | . . . . | . . . .
Введення-виведення
Для довідки буде використано зразковий пазл із веб-сторінки шахматних пасьянсів:
. . . .
. 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]]]