Recentemente, fui apresentado a um jogo de quebra-cabeça conhecido como Solitaire Chess . Vou resumir as regras aqui:
- O tabuleiro é um tabuleiro de damas 4x4.
- Todas as peças são da mesma cor (sem equipes) e todas as peças podem capturar qualquer outra peça.
- Cada movimento deve ser uma captura. Não há movimento para quadrados vazios.
- Deve haver exatamente uma peça restante no final.
- Todas as peças se movem exatamente como no xadrez, com uma modificação: o peão pode capturar em qualquer direção diagonal (o que tecnicamente o torna ferz ). Para o benefício de quem não sabe, incluí diagramas de movimento.
- Nenhuma das outras regras do xadrez (como xadrez, boliche, etc.) se aplica aqui. É tudo sobre capturas.
Rei (K)
K * . . | * K * . | * * * .
* * . . | * * * . | * K * .
. . . . | . . . . | * * * .
. . . . | . . . . | . . . .
Rainha (Q)
Q * * * | * Q * * | * * * .
* * . . | * * * . | * Q * *
* . * . | . * . * | * * * .
* . . * | . * . . | . * . *
Torre (R)
R * * * | * R * * | . * . .
* . . . | . * . . | * R * *
* . . . | . * . . | . * . .
* . . . | . * . . | . * . .
Bispo (B)
B . . . | . B . . | * . * .
. * . . | * . * . | . B . .
. . * . | . . . * | * . * .
. . . * | . . . . | . . . *
Cavaleiro (N)
N . . . | . N . . | . . . *
. . * . | . . . * | . N . .
. * . . | * . * . | . . . *
. . . . | . . . . | * . * .
Peão (P)
P . . . | . P . . | * . * .
. * . . | * . * . | . P . .
. . . . | . . . . | * . * .
. . . . | . . . . | . . . .
Entrada / saída
Para referência, o exemplo de quebra-cabeça da página Solitaire Chess será usado:
. . . .
. B . .
R P . .
. . . N
A solução é levar o peão com o cavaleiro, depois o cavaleiro com a torre e, finalmente, levar o bispo com a torre.
Entrada
A entrada deve estar em uma das três formas; você é livre para escolher o que for mais conveniente para você.
- Uma sequência de caracteres como
.....B..RP.....N
, com ou sem novas linhas. O caractere que representa um espaço em branco pode ser qualquer caractere que não sejaKQRBNP
. - Uma lista de listas (ou uma lista nivelada) em que os elementos são caracteres ou números, assim:
[['.', '.', '.', '.'], ['.', 'B', '.', '.'], ['R', 'P', '.', '.'], ['.', '.', '.', 'N']]
ou[[0, 0, 0, 0], [0, 4, 0, 0], [3, 6, 0, 0], [0, 0, 0, 5]]
. Para o primeiro, o personagem que representa um espaço em branco pode ser qualquer coisa que não sejaKQRBNP
. Para este último, dei às peças o número que corresponde à sua classificação na minha lista de movimentos anterior (1
é um rei,4
é um bispo,6
é um peão, etc.). Você é livre para alterar a numeração. - A lista de coordenadas onde cada elemento tem a forma
[x, y, 'c']
, assim:[[1, 2, 'B'], [0, 1, 'R'], [1, 1, 'P'], [3, 0, 'N']]
.
Se você escolher um dos formatos de entrada baseados em lista, os separadores e delimitadores podem ter caracteres razoáveis e compreensíveis.
Resultado
A saída deve ser uma sequência de movimentos ou uma sequência de estados da placa. Alguns quebra-cabeças têm mais de uma solução; você pode produzir um ou todos eles. Se você optar por gerar uma sequência de estados da placa, cada placa deverá estar em um dos três formatos de entrada, com um separador razoável (como novas linhas) entre eles.
Se você optar por saída de uma seqüência de movimentos, que deve ser expresso como uma lista de pares de pares de coordenadas, assim: [[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
. [0,0]
representa o canto inferior esquerdo e, novamente, separar e delimitar caracteres pode ser uma escolha razoável.
Se uma determinada placa não puder ser resolvida, imprima qualquer valor falso ( 0
, sequência vazia, etc.). Se um determinado painel tiver menos de duas peças, o comportamento será indefinido.
Casos de teste
Nota: as saídas são fornecidas apenas como uma lista de pares de coordenadas, já que os outros formatos devem ser bastante fáceis de verificar se estão corretos (e eu não queria digitar todos os possíveis formatos de saída). Além disso, para os quebra-cabeças que possuem mais de uma solução, apenas uma possibilidade é fornecida.
Entrada 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']]
Saída 1:
[[[2,0], [1,1]], [[1,1], [3,3]]]
Entrada 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']]
Saída 2:
[[[3,0], [1,1]], [[0,1], [1,1]], [[1,1], [1,2]]]
Entrada 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']]
Saída 3:
[[[2,0], [3,1]], [[0,1], [1,3]], [[0,2], [1,3]], [[2,3], [1,3]], [[3,1], [1,3]]]
Entrada 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']]
Saída 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]]]
Entrada 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']]
Saída 5:
[[[0,3], [1,2]], [[1,2], [2,1]], [[2,1], [1,0]], [[1,0], [0,1]]]
Entrada 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']]
Saída 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]]]