서로 공격하지 않도록 기물 제거하기
시간 제한1초메모리 제한128 MB
최대 15개 기물이 놓인 보드마다 서로 공격하지 않는 기물만 남도록 치우는 최소 개수를 구합니다.
문제
체스에서 기물을 잃지 않으려면 애초에 서로 마주치지 않게 두는 것이 좋은 전략이다. IBM은 딥블루에게 이 전략을 가르치려고 한다. 그래서 보드에 남은 기물끼리 아무도 서로를 공격하지 않는 상태로 만들려면 기물을 최소 몇 개 없애야 하는지 구하는 프로그램이 필요하다.
모든 기물은 일반적인 체스 규칙대로 공격한다.
- 킹(King): 상하좌우와 대각선으로 인접한 칸을 공격한다.
- 퀸(Queen): 상하좌우와 대각선으로 거리 제한 없이 공격한다.
- 비숍(Bishop): 대각선으로 거리 제한 없이 공격한다.
- 룩(Rook): 상하좌우로 거리 제한 없이 공격한다.
- 나이트(Knight): L자로 공격한다. 상하좌우 중 한 방향으로 두 칸 간 다음, 그와 직각인 방향으로 한 칸 간 자리가 공격 범위다. 아래 그림을 참고한다.
- 폰(Pawn): 이 문제에 폰은 나오지 않는다.
---------------
| | |*| |*| | |
---------------
| |*| | | |*| |
---------------
| | | |N| | | |
---------------
| |*| | | |*| |
---------------
| | |*| |*| | |
---------------
N = 나이트
* = 나이트가 공격할 수 있는 칸
두 기물 사이를 다른 기물이 막고 있는 상황까지 따져도 답은 같으므로, 경로가 막히는지는 신경 쓰지 않아도 된다.
입력
입력은 최대 100개의 데이터 셋으로 이루어지고, 데이터 셋 사이를 구분하는 빈 줄은 없다. 보드는 최대 10x10이며, 한 데이터 셋에 놓인 기물은 최대 15개다.
각 데이터 셋은 다섯 부분으로 나뉜다.
- 첫 줄에
START가 주어진다. - 다음 줄에 보드의 가로 길이 가 주어진다. ()
- 다음 줄에 보드의 세로 길이 가 주어진다. ()
- 이어지는 개의 줄에 보드의 모양이 주어진다. 각 줄에는 글자 개가 공백으로 구분되어 있고, 번째 줄이 보드의 번째 행이다. 각 글자의 뜻은 다음과 같다.
K: 킹Q: 퀸R: 룩B: 비숍N: 나이트E: 빈 칸
- 마지막 줄에
END가 주어진다.
입력은 파일의 끝에서 끝난다.
출력
데이터 셋마다 한 줄씩 다음 형식으로 출력한다. 출력 사이를 구분하는 빈 줄은 없다.
Minimum Number of Pieces to be removed: X
여기서 X는 남은 기물끼리 서로 공격하지 않게 만들려고 제거해야 하는 기물의 최소 개수다.