Betris (Large)
문제
Betris (Large) 문제는 Betris 문제와 보드의 크기, 칩의 개수, 블록 종류, 총 라운드 수를 제외한 차이는 없습니다.
Betris (Large)는 크기의 보드 위에서 제시되는 폴리오미노 블록을 차지하기 위해 상대와 베팅 대결을 벌이고, 획득한 블록을 효율적으로 배치하여 보드를 채워나가는 전략 게임입니다.
1. 보드 및 구성 요소
각 플레이어는 게임이 시작할 때 비어 있는 보드 개와 베팅에 사용할 칩 개를 보유합니다.

보드는 행 열로 구성되어 있습니다. 행 번호는 위에서 아래로 행부터 행까지, 열 번호는 왼쪽에서 오른쪽으로 열부터 열까지이며, 행 열의 칸을 로 표기합니다. 칩은 이후 베팅 단계에서 사용할 수 있습니다.

게임에는 종의 폴리오미노 블록이 사용됩니다. 각 블록의 모양 및 명칭은 위와 같습니다.
2. 게임 진행
게임은 총 라운드 동안 진행됩니다. 각 라운드는 베팅 단계와 배치 단계로 나뉩니다.
1단계: 베팅 단계 (Betting Phase)
- 채점기는 종의 블록 중 하나를 균등한 확률로 선택해 로 정한 뒤, 를 제외한 종의 블록 중 하나를 균등한 확률로 선택해 로 정합니다.
- 각 플레이어는 또는 중 원하는 블록과 베팅할 칩 개수를 채점기에 전달합니다. 베팅에 사용할 칩 개수는 이상 이하여야 하며, 자신이 현재 보유하고 있는 칩 개수 이하여야 합니다.
- 두 플레이어가 원하는 블록과 칩 개수를 결정했다면, 이후 채점기는 다음 규칙에 따라 베팅 성공 여부를 플레이어에게 알려줍니다.
- 두 플레이어가 서로 다른 블록을 선택했다면, 두 플레이어 모두 베팅에 성공합니다.
- 두 플레이어가 같은 블록을 선택했고 베팅한 칩 개수가 다르다면, 베팅한 칩 개수가 더 많은 플레이어가 베팅에 성공합니다.
- 두 플레이어가 같은 블록을 선택했고 베팅한 칩 개수가 같다면, 채점기가 무작위로 고른 한 플레이어가 베팅에 성공합니다.
- 베팅에 성공한 플레이어는 자신이 원하는 블록을 획득하며, 자신이 베팅한 칩 개수만큼의 칩을 지불합니다.
- 베팅에 실패한 플레이어는 자신이 원하지 않은 블록을 획득하며, 칩을 지불하지 않습니다.
2단계: 배치 단계 (Placement Phase)
- 각 플레이어는 획득한 블록을 원하는 만큼 시계 방향으로 회전시킬 수 있습니다.
- 각 플레이어는 획득한 블록을 원하는 만큼 좌우로 대칭시킬 수 있습니다.
- 이후 플레이어는 보드에 블록을 배치하거나 패스를 선택할 수 있습니다.
- 배치를 선택하면 블록은 보드를 벗어나지 않으면서 다른 블록이 차지하지 않은 칸에 배치되어야 합니다.
- 블록을 배치할 공간이 있더라도 배치하지 않는 것이 유리하다고 판단되면 패스를 선택할 수 있습니다.
3. 점수 산정
모든 라운드가 종료된 후, 각 플레이어의 점수는 다음과 같이 계산됩니다.
- 보드에서 블록이 차지하고 있는 칸의 개수당 점을 획득합니다.
- 보드 위의 채워진 칸으로만 만들 수 있는 가장 큰 정사각형의 칸의 개수당 점을 획득합니다.
- 남은 칩 개수당 점을 획득합니다.
예를 들어, 다음과 같은 경우 플레이어의 점수는 점입니다.

최종 승자는 점수가 더 높은 플레이어이며, 점수가 같다면 무승부입니다.
입력
채점기는 다음의 한 줄 단위로 플레이어와 통신합니다.
| 명령어 | 채점기→플레이어 (입력) | 플레이어→채점기 (출력) | 시간 제한 (ms) | 설명 |
|---|---|---|---|---|
| READY | READY |
OK |
3000 |
게임의 시작을 알립니다. |
| PHASE1 | PHASE1 A B my_time opp_time |
BET C x |
my_time |
채점기가 선택한 블록 쌍 와 나와 상대의 남은 시간을 알립니다. 이번 턴에 내가 선택한 블록과 베팅한 칩 개수를 출력합니다. |
| PHASE2 | PHASE2 C my_chip opp_chip my_time opp_time |
PLACE k x1 y1 ... xk yk |
my_time |
베팅 단계가 끝난 뒤, 내가 획득한 블록, 나와 상대의 남은 칩 개수와 시간을 알립니다. 이후 배치 단계에서 배치를 선택했다면, 새로 배치한 블록이 차지하는 칸의 개수와 좌표를 출력합니다. 패스를 선택했다면 PLACE 0을 출력합니다. |
| OPP | OPP k x1 y1 ... xk yk |
- | - | 배치 단계가 끝난 뒤, 상대가 출력한 k x1 y1 ... xk yk를 알립니다. |
| FINISH | FINISH |
- | - | 게임 종료를 알립니다. 플레이어는 추가 출력 없이 프로그램을 정상 종료해야 합니다. |
READY 명령어는 라운드가 시작하기 전에 한 번 주어지며, FINISH 명령어는 라운드가 끝난 뒤에 한 번 주어집니다.
PHASE1, PHASE2, OPP 명령어는 각 라운드마다 순서대로 한 번씩 주어집니다.
PHASE1의 명령어의 입력은 다음의 조건을 만족하며, 출력은 다음의 조건을 만족해야 합니다.
- 입력의
A,B는I1,I2,I3,L3,I4,L4,S4,T4,O4,I5,L5,F5,N5,P5,T5,U5,V5,W5,X5,Y5,Z5중 하나입니다. - 입력의
A,B는 서로 다릅니다. - 출력의
C는 입력으로 주어진A,B중 하나여야 합니다. - 출력의
x는 이상 이하의 정수여야 하며, 내가 가진 칩 개수를 넘으면 안됩니다.
PHASE2의 명령어의 입력은 다음의 조건을 만족하며, 출력은 다음의 조건을 만족해야 합니다.
- 입력의
C는 이전 베팅 단계에서 입력으로 주어진A,B중 하나입니다. - 출력의
k x1 y1 ... xk yk는 단일 공백으로 구분된 개의 정수여야 합니다. - 인 경우 는
C의 칸 개수여야 합니다. - 인 경우 이어지는 개의 정수는 차례로 배치 단계에서 블록이 배치되는 서로 다른 개 칸의 좌표 를 의미해야 하며, 규칙에 맞게 플레이할 때
C를 해당 위치에 배치할 수 있어야 합니다.
모든 명령어에서 입력은 다음의 조건을 만족하며, 출력은 다음의 조건을 만족해야 합니다.
my_chip,opp_chip은 정수입니다.my_time,opp_time은 정수이며, 시간은 밀리초(millisecond) 단위로 주어집니다.- 모든 출력 후에는 개행문자를 출력한 뒤 버퍼를 flush해야 합니다.
- 시간 제한이 있는 명령에서 출력을 제한 내에 수행하지 않으면 시간 초과(
TLE) 판정을 받습니다. - 출력 형식에 맞지 않는 문자열을 출력하면 런타임 에러(
RE) 판정을 받습니다.
예시
| P1 입력 | P1 출력 | P2 입력 | P2 출력 |
|---|---|---|---|
READY |
READY |
||
OK |
OK |
||
PHASE1 I2 F5 10000 10000 |
PHASE1 I2 F5 10000 10000 |
||
BET F5 4 |
BET F5 4 |
||
PHASE2 F5 20 24 9999 9999 |
PHASE2 I2 24 20 9999 9999 |
||
PLACE 5 1 1 1 2 2 2 2 3 3 2 |
PLACE 2 1 1 1 2 |
||
OPP 2 1 1 1 2 |
OPP 5 1 1 1 2 2 2 2 3 3 2 |
||
PHASE1 P5 L3 9998 9998 |
PHASE1 P5 L3 9998 9998 |
||
BET P5 5 |
BET L3 2 |
||
PHASE2 P5 15 22 9997 9997 |
PHASE2 L3 22 15 9997 9997 |
||
PLACE 5 1 3 1 4 1 5 2 4 2 5 |
PLACE 3 1 3 1 4 2 3 |
||
OPP 3 1 3 1 4 2 3 |
OPP 5 1 3 1 4 1 5 2 4 2 5 |
||
FINISH |
FINISH |
샘플 코드
- C20 : sample.c
- CPP20 : sample.cpp
- PYTHON3, PYPY3 : sample.py
제한
- 시간 : 각 플레이어에게 주어지는 첫 번째 PHASE1 명령어에서
my_time은 ms입니다. - 메모리 : 1024MB
- 채점 환경 : HELP > 채점 환경
