ALPHANO Logo

세균 전쟁

Top Player제출참가자
___24221

문제 설명

[ALPHANO] 세균전쟁 규칙 설명 (Youtube)

7×77 \times 7 크기의 배양판 위에서 두 종류의 세균(OX)이 세력 다툼을 합니다.

배양판은 1×11 \times 1 크기의 칸이 7777열로 배열된 형태입니다. 행 번호는 위에서 아래로 11행부터 77행, 열 번호는 왼쪽에서 오른쪽으로 11열부터 77열까지이며, xxyy열의 칸을 (x,y)(x,y)로 표기합니다.

fig1

각 칸은 빈 칸 ., 선공 세균 O, 후공 세균 X 중 하나의 상태를 가집니다. 초기에는 (1,1)(1,1)(7,7)(7,7)에는 선공 세균 O가, (1,7)(1,7)(7,1)(7,1)에는 후공 세균 X가 놓이며, 나머지 4545개의 칸은 모두 빈 칸 .입니다.

세력 다툼은 선공 세균 O부터 시작하여 OX가 번갈아 턴을 진행합니다. 자신의 턴에는 본인 세균이 놓인 시작 칸 (x1,y1)(x_1,y_1)에서 비어있는 도착 칸 (x2,y2)(x_2,y_2)을 선택하여 세균을 퍼뜨릴 수 있습니다.

  • 이동 거리 d=max(x1x2,y1y2)d=\max\left(|x_1-x_2|,|y_1-y_2|\right)는 반드시 11 또는 22여야 합니다.
  • 이동 거리가 11인 경우는 분열(Division)이라 부릅니다. 분열을 선택하면 시작 칸 (x1,y1)(x_1,y_1)의 세균은 그대로 남고 도착 칸 (x2,y2)(x_2,y_2)에 동일한 세균이 새로 생깁니다.
  • 이동 거리가 22인 경우는 도약(Leap)이라 부릅니다. 도약을 선택하면 시작 칸 (x1,y1)(x_1,y_1)의 세균은 사라져 빈 칸 .이 되고, 도착 칸 (x2,y2)(x_2,y_2)에만 세균이 새로 생깁니다.
  • 분열 또는 도약 행동이 끝난 직후에는 즉시 감염(Infection)이 진행됩니다. 감염은 도착 칸 (x2,y2)(x_2,y_2)을 기준으로 88방향(상하좌우, 대각선)으로 인접한 칸에 있는 상대 세균이 현재 차례의 세균으로 바뀌는 것을 의미합니다.
  • 자신의 턴에 수행할 수 있는 합법적인 분열이나 도약이 전혀 없다면, PASS를 선택해야 하며, 이 경우 배양판에는 아무 변화 없이 턴이 넘어갑니다.

정리하면, 각 세균은 자신의 턴에 세균을 퍼트릴 방법이 있다면 분열 또는 도약을 선택합니다. 이후 감염이 진행되고 턴을 마칩니다. 그렇지 않다면 PASS를 선택해 즉시 턴을 마칩니다.

다음은 선공 세균이 (1,1)(1, 1)에서 (2,2)(2, 2)로 분열을 수행하는 예시입니다.

fig2

다음은 후공 세균이 (2,2)(2, 2)에서 (4,4)(4, 4)로 도약을 수행하는 예시입니다.

fig3

마지막으로 다음은 선공 세균이 PASS를 선택해야 하는 예시입니다.

fig4

세력 다툼은 다음 조건 중 하나가 만족되면 종료됩니다.

  • 어느 한쪽의 세균이 배양판에서 완전히 사라졌을 때
  • 배양판에 남은 빈 칸이 없을 때
  • 두 세균이 모두 200200번씩 행동을 수행했을 때 (총 400400턴 진행)

세력 다툼은 종료 시점에 더 많은 칸을 점유한 쪽이 승리하며, 만약 점유한 칸 수가 동일할 경우 무승부로 처리합니다.

배양판의 최종 승자가 될 세균을 위한 AI를 설계해주세요!

입출력 형식

심판 프로그램은 다음의 한 줄 단위의 텍스트 명령으로 에이전트와 통신합니다.

명령어 심판→에이전트(입력) 에이전트→심판 (출력) 시간 제한(ms) 설명
READY READY (FIRST | SECOND) OK 3000 선공/후공 정보를 알립니다.
TURN TURN my_time opp_time MOVE x1 y1 x2 y2 my_time 내 남은 시간과 상대의 남은 시간을 알립니다. 이번 턴에 내가 선택한 수의 (x1,y1)(x_1, y_1), (x2,y2)(x_2, y_2)를 출력합니다. PASS를 선택한 경우는 MOVE -1 -1 -1 -1을 출력합니다.
OPP OPP x1 y1 x2 y2 time - - 상대가 직전에 둔 수와 사용한 시간을 알립니다. 상대가 PASS를 선택한 경우는 OPP -1 -1 -1 -1 time이 입력됩니다.
FINISH FINISH - - 게임 종료를 알립니다. 에이전트는 추가 출력 없이 프로그램을 정상 종료해야 합니다.

x1, y1, x2, y211 이상 77 이하의 정수이며, my_time, opp_time, time11 이상 1000010\,000 이하의 정수입니다.

모든 출력 후에는 개행문자를 출력한 뒤 버퍼를 flush해야 합니다.

시간 제한이 있는 명령에서 출력을 제한 내에 수행하지 않으면 시간 초과(TLE) 판정을 받습니다.

출력 형식에 맞지 않는 문자열을 출력하거나, TURN 명령어가 주어질 때 합법적이지 않은 수를 출력하면 런타임 에러(RE) 판정을 받습니다.

입출력 예시

선공 입력 선공 출력 후공 입력 후공 출력
READY FIRST READY SECOND
OK OK
TURN 10000 10000
MOVE 1 1 2 2
OPP 1 1 2 2 50
TURN 10000 9950
MOVE 7 7 6 6
OPP 7 7 6 6 20
TURN 9950 9980
MOVE -1 -1 -1 -1
FINISH FINISH

예제 코드

제한