PRB-001 · CASCADE ICEBREAKER

빙판 가르기

9×9 빙판에서 빈칸을 선택해 영역을 분리하고, 작은 영역을 연쇄 점령하여 점수를 겨루는 에이전트 대전 문제입니다.
보드
9 × 9
최대 턴
81
턴 응답 제한
250 ms
실제 제출
01

문제

A와 B는 번갈아 비어 있는 칸 하나를 고릅니다. 선택한 칸은 자신의 영역이 되고, 그 선택이 빈 영역을 여러 조각으로 나누면 가장 큰 조각보다 작은 영역을 모두 가져옵니다.

빈칸이 모두 사라지거나 경기가 조기 종료되었을 때 누적 점수가 높은 에이전트가 승리합니다. 경기는 최대 81턴까지 진행됩니다.

  1. 01선택

    빈칸 하나를 고릅니다.

  2. 02분리

    빈 영역이 큰 쪽과 작은 쪽으로 갈라집니다.

  3. 03연쇄 점령

    가장 큰 영역보다 작은 쪽을 가져옵니다.

02

규칙

  1. 01

    보드는 9×9이며 각 칸에는 -2, -1, 0, 1, 2 중 하나의 점수값이 있습니다. # 벽과 이미 점령된 칸은 선택할 수 없습니다.

  2. 02

    A와 B가 번갈아 진행합니다. 자기 차례에는 현재 비어 있는 . 칸의 0-indexed 좌표를 <row> <col> 형식으로 출력합니다.

  3. 03

    선택한 칸은 즉시 자기 편의 영역이 되고, 그 칸의 점수값이 누적 점수에 더해집니다.

  4. 04

    선택으로 기존 빈 연결 영역이 여러 컴포넌트로 나뉘면, 최대 크기보다 작은 컴포넌트를 모두 연쇄 점령합니다. 최대 크기가 여럿이면 그 컴포넌트들은 모두 빈칸으로 남습니다.

  5. 05

    빈칸이 모두 사라지면 누적 점수가 높은 편이 승리합니다. invalid action 3회, 응답 시간 초과, 런타임 오류가 발생하면 즉시 패배합니다.

03

입출력

제출한 프로그램은 경기마다 한 번 실행되고, stdin이 EOF가 될 때까지 살아 있어야 합니다. 통신은 항상 한 줄 단위입니다.

프로그램 생명주기와 표준 입출력 교환
시점stdinstdout제한
프로그램 시작별도 초기 입력 없음출력 없음
자기 차례JSON 객체 1줄<row> <col> 1줄 + flush250 ms
경기 종료EOF추가 출력 없이 종료
INPUT

자기 차례의 JSON 요청

실제 전송은 들여쓰기 없는 JSON 객체 한 줄입니다.

전략 판단에 필요한 핵심 필드

필드타입의미
side"A" | "B"이 프로세스가 조종하는 편
turnnumber1부터 시작하는 현재 전체 턴
scores{ A, B }양쪽의 최신 누적 점수
state.cellsstring[9]. 빈칸, # 벽, a/b 점령 칸
state.valuesnumber[9][9]각 칸의 점수값
state.invalidCounts{ A, B }양쪽의 누적 invalid action 횟수
state.remainingCellsnumber현재 선택 가능한 빈칸 수
나머지 요청 필드 보기
필드타입의미
schemaVersionstring항상 codeversus.agent-turn.v1
matchIdstring현재 경기의 공개 ID
maxTurnsnumber최대 전체 턴 수. 현재 81
observationstring같은 턴 상태의 텍스트 표현. 판단에는 구조화된 state 사용을 권장
state.width / heightnumber보드 너비와 높이. 현재 각각 9
state.agents{ A, B }양쪽의 최근 좌표와 활성 상태
agentobject내 side·사용자·제출·언어 메타데이터
opponentobject상대 side·사용자·제출·언어 메타데이터
OUTPUT

좌표 한 줄

방금 받은 요청마다 정확히 한 번 응답합니다.

stdout2 5
  • 입력 JSON 한 줄마다 0-indexed 좌표 <row> <col> 한 줄만 stdout으로 출력합니다.
  • 좌표는 0 ≤ row, col < 9이고, 방금 받은 state.cells[row][col]이 .인 칸이어야 합니다.
  • 출력 뒤 즉시 flush합니다. Python은 print(..., flush=True), C++은 std::endl 또는 명시적 flush를 사용하세요.
  • 디버그 로그는 stderr로 보냅니다. 빈 줄, 설명 문장, 여러 좌표, 형식 오류, 범위 밖 좌표, 선택 불가능한 칸은 invalid action입니다.

위 출력은 state.cells[2][5] === "."인 칸을 선택합니다. 행과 열은 모두 0부터 시작합니다.

전체 JSON 요청 예시 보기

읽기 편하도록 들여썼지만 실제 stdin에서는 아래 객체 전체가 한 줄로 전달됩니다.

{
  "schemaVersion": "codeversus.agent-turn.v1",
  "matchId": "match_0007",
  "side": "A",
  "turn": 17,
  "maxTurns": 81,
  "observation": "TURN 17 81\nYOU A\nBOARD 9 9\nSCORE 28 17\nVALUES\n0 1 -1 2 0 -2 1 0 2\n1 0 0 -1 2 1 -2 0 1\n-1 2 0 1 0 -1 2 1 0\n0 -1 2 0 1 2 0 -2 1\n2 0 -1 1 0 2 -1 1 0\n-2 1 0 2 -1 0 1 2 0\n1 -2 2 0 1 -1 0 1 2\n0 1 -1 2 0 1 -2 0 1\n2 0 1 -1 2 0 1 -2 0\nOWNERS\n.........\n..#......\n....a....\n.........\n...b.....\n.........\n.........\n.........\n.........\nINVALID 0 1\nACTION row col\nEND",
  "scores": {
    "A": 28,
    "B": 17
  },
  "state": {
    "width": 9,
    "height": 9,
    "cells": [
      ".........",
      "..#......",
      "....a....",
      ".........",
      "...b.....",
      ".........",
      ".........",
      ".........",
      "........."
    ],
    "values": [
      [
        0,
        1,
        -1,
        2,
        0,
        -2,
        1,
        0,
        2
      ],
      [
        1,
        0,
        0,
        -1,
        2,
        1,
        -2,
        0,
        1
      ],
      [
        -1,
        2,
        0,
        1,
        0,
        -1,
        2,
        1,
        0
      ],
      [
        0,
        -1,
        2,
        0,
        1,
        2,
        0,
        -2,
        1
      ],
      [
        2,
        0,
        -1,
        1,
        0,
        2,
        -1,
        1,
        0
      ],
      [
        -2,
        1,
        0,
        2,
        -1,
        0,
        1,
        2,
        0
      ],
      [
        1,
        -2,
        2,
        0,
        1,
        -1,
        0,
        1,
        2
      ],
      [
        0,
        1,
        -1,
        2,
        0,
        1,
        -2,
        0,
        1
      ],
      [
        2,
        0,
        1,
        -1,
        2,
        0,
        1,
        -2,
        0
      ]
    ],
    "agents": {
      "A": {
        "row": 2,
        "col": 4,
        "alive": true
      },
      "B": {
        "row": 4,
        "col": 3,
        "alive": true
      }
    },
    "invalidCounts": {
      "A": 0,
      "B": 1
    },
    "remainingCells": 78
  },
  "agent": {
    "side": "A",
    "username": "dori",
    "submissionId": "sub_0042",
    "language": "python3",
    "displayName": "cut-v4"
  },
  "opponent": {
    "side": "B",
    "username": "sample-cascade-edge",
    "submissionId": "sample-cascade-edge",
    "language": "python3",
    "displayName": "Edge Sample Bot"
  }
}