보드 게임의 모든 이동 나열

시간 제한1초메모리 제한128 MB

문제

보드 게임 엔진의 일부를 작성합니다. 판의 배치와 한 명의 플레이어가 주어질 때, 그 플레이어가 둘 수 있는 모든 합법적인 이동을 나열해야 합니다.

게임은 모두 같은 색인 $8 \times 8$ 칸의 격자판에서 진행됩니다. 행은 위에서 아래로 A부터 H까지, 열은 왼쪽에서 오른쪽으로 1부터 8까지 이름이 붙습니다. 따라서 각 칸은 행 문자 뒤에 열 숫자를 붙여 나타냅니다(예를 들어 A1은 가장 왼쪽 위 칸, H8은 가장 오른쪽 아래 칸입니다).

두 플레이어가 있으며, 각자의 말은 XO(숫자 0이 아니라 알파벳 "오")로 표기합니다. 어느 시점에나 각 플레이어는 판 위에 1개 이상 12개 이하의 말을 가집니다. 이동은 다음 규칙을 따릅니다.

  1. 말은 직선으로만 움직입니다 — 왼쪽, 오른쪽, 위, 아래, 또는 두 대각선 방향 중 하나입니다.
  2. 말이 움직이는 칸 수는, 움직이는 방향의 행·열·대각선에 현재 놓인 양쪽 플레이어의 말 전체 개수와 같습니다. 말은 반드시 정확히 그 칸 수만큼 움직여야 하며, 그보다 많거나 적게 움직일 수 없습니다.
  3. 말은 자기 편 말을 뛰어넘을 수 있습니다.
  4. 말은 상대 편 말을 뛰어넘을 수 없습니다.
  5. 말은 상대 편 말이 있는 칸에 도착하여 그 말을 잡을 수 있습니다.
  6. 말은 이미 자기 편 말이 있는 칸에는 도착할 수 없습니다.

입력

입력은 하나 이상의 판 배치로 이루어집니다. 각 배치는 8개의 문자로 이루어진 8줄로 주어지며, 각 문자는 X, O, 또는 .(마침표)입니다. XO는 말이 놓인 칸을, .은 빈 칸을 나타냅니다. 각 판 바로 다음 줄에는 X 또는 O 문자 하나가 있으며, 이는 이동을 나열할 플레이어를 가리킵니다. 입력은 파일의 끝에서 종료됩니다.

출력

각 판에 대해, 지정된 플레이어의 모든 합법적인 이동을 한 줄에 하나씩 출력합니다. 각 줄은 출발 칸과 도착 칸을 그 순서대로 하이픈 - 하나로 이어서 나타냅니다(예: A1-B2). 각 칸은 행 문자 뒤에 열 숫자를 붙여 적습니다. 해당 판에서 그 플레이어가 둘 수 있는 이동이 없으면 대신 No moves are possible을 출력합니다. 연속한 판의 출력 사이는 빈 줄 하나로 구분합니다.

출력이 유일하게 정해지도록, 다음 순서를 정확히 지켜 이동을 나열합니다. 판의 칸을 위에서 아래로, 각 행 안에서는 왼쪽에서 오른쪽으로 훑습니다. 지정된 플레이어의 각 말에 대해, 여덟 방향을 시계 방향 순서로 — 위, 오른쪽 위, 오른쪽, 오른쪽 아래, 아래, 왼쪽 아래, 왼쪽, 왼쪽 위 — 검사하여, 합법적인 이동을 발견한 순서대로 출력합니다.