Domineering
문제
크기의 보드 위에서 두 플레이어가 도미니어링 게임을 진행합니다.
1. 보드 및 구성 요소
보드는 행 열부터 행 열까지 개의 칸으로 구성되며, 행 열의 칸을 로 표기합니다. 초기 보드의 모든 칸은 빈 칸으로 주어지며, 각 칸 에는 이상 이하의 정수 가 하나씩 적혀있습니다.
다음은 초기 보드의 예시입니다.

초기에 선공 플레이어는 점으로, 후공 플레이어는 점으로 게임을 시작합니다.
2. 게임 진행
게임은 선공 플레이어부터 시작해 두 플레이어가 번갈아 턴을 진행합니다.
선공 플레이어는 자신의 턴에 가로로 인접한 두 빈 칸을 덮는 크기의 도미노를 놓거나, PASS를 선택할 수 있습니다. 도미노를 놓는 경우, 플레이어는 보드 위의 빈 칸 와 을 동시에 덮어야 하며, 두 칸에 적혀있던 정수의 합만큼 점수를 획득합니다.
다음은 선공 플레이어가 와 을 덮는 도미노를 놓는 예시입니다.

후공 플레이어는 자신의 턴에 세로로 인접한 두 빈 칸을 덮는 크기의 도미노를 놓거나, PASS를 선택할 수 있습니다. 도미노를 놓는 경우, 플레이어는 보드 위의 빈 칸 와 을 동시에 덮어야 하며, 두 칸에 적혀있던 정수의 합만큼 점수를 획득합니다.
다음은 후공 플레이어가 와 를 덮는 도미노를 놓는 예시입니다.

3. 게임 종료
게임은 두 플레이어가 연속해서 PASS를 선택하거나, 두 플레이어 모두 도미노를 놓을 수 있는 위치가 없는 경우 종료됩니다.
게임이 종료된 시점에 점수가 더 큰 플레이어가 승리합니다.
보드의 최종 승자가 되기 위한 AI를 설계해주세요!
입력
채점기와 플레이어가 통신을 시작하기 전 개 줄에 걸쳐 다음의 입력이 주어집니다.
- 번째 줄에 보드의 각 칸에 적힌 정수를 의미하는 이 공백으로 구분되어 주어집니다.
이후 채점기는 다음의 한 줄 단위로 플레이어와 통신합니다.
| 명령어 | 채점기→플레이어 (입력) | 플레이어→채점기 (출력) | 시간 제한 (ms) | 설명 |
|---|---|---|---|---|
| READY | READY (FIRST or SECOND) |
OK |
3000 |
선공/후공 정보를 알립니다. |
| TURN | TURN my_time opp_time |
MOVE x y |
my_time |
내 남은 시간과 상대의 남은 시간을 알립니다. 이번 턴에 내가 돌을 놓을 칸 를 출력합니다. PASS를 선택한 경우에는 MOVE -1 -1을 출력합니다. |
| OPP | OPP x y time |
- | - | 상대가 직전에 둔 수와 사용한 시간을 알립니다. 상대가 PASS를 선택했다면 OPP -1 -1 time이 입력됩니다. |
| FINISH | FINISH |
- | - | 게임 종료를 알립니다. 플레이어는 추가 출력 없이 프로그램을 정상 종료해야 합니다. |
move와opp명령어에서x,y는 정수이며,x,y가 모두-1이 아닌 경우는 플레이어가 놓은 도미노가 덮는 두 칸 중 행 번호, 열 번호가 작은 칸의 좌표가 임을 의미합니다.my_time,opp_time,time은 정수이며, 시간은 밀리초(millisecond) 단위로 주어집니다.- 모든 출력 후에는 개행문자를 출력한 뒤 버퍼를 flush해야 합니다.
- 시간 제한이 있는 명령에서 출력을 제한 내에 수행하지 않으면 시간 초과(
TLE) 판정을 받습니다. - 출력 형식에 맞지 않는 문자열을 출력하거나, TURN 명령어가 주어질 때 합법적이지 않은 수를 출력하면 런타임 에러(
RE) 판정을 받습니다.
예시
| 선공 입력 | 선공 출력 | 후공 입력 | 후공 출력 |
|---|---|---|---|
0 0 0 0 0 0 0 0 |
0 0 0 0 0 0 0 0 |
||
3 3 0 0 0 0 0 0 |
3 3 0 0 0 0 0 0 |
||
0 0 0 0 0 0 0 0 |
0 0 0 0 0 0 0 0 |
||
0 0 0 0 0 0 0 0 |
0 0 0 0 0 0 0 0 |
||
0 0 0 0 0 0 1 0 |
0 0 0 0 0 0 1 0 |
||
0 0 0 0 0 0 2 0 |
0 0 0 0 0 0 2 0 |
||
0 0 0 0 0 0 0 0 |
0 0 0 0 0 0 0 0 |
||
0 0 0 0 0 0 0 0 |
0 0 0 0 0 0 0 0 |
||
READY FIRST |
READY SECOND |
||
OK |
OK |
||
TURN 10000 10000 |
|||
MOVE 2 1 |
|||
OPP 2 1 50 |
|||
TURN 10000 9950 |
|||
MOVE 5 7 |
|||
OPP 5 7 20 |
|||
| ... | ... | ... | ... |
FINISH |
FINISH |
샘플 코드
- CPP20 : sample.cpp
제한
- 시간 : 각 플레이어에게 주어지는 첫 번째 TURN 명령어에서
my_time은 입니다. - 메모리 :
- 채점 환경 : HELP > 채점 환경
