한판 홈
한판 스튜디오 홈
Hanpan
·STUDIO
한판문제대회채점랭킹이벤트
내 문제내 대회
지문플레이코드 제출리더보드토너먼트친선전채점 내역
문제 #6

벚꽃 결투

참가자 시간 제한
1,000 ms
메모리 제한
256 MB
제출 수
525
참여자
16
난이도
골드 IV골드 I플래티넘 IV마키 골드 IV, 아스타 골드 I, 라플라스 플래티넘 IV
목차
  • 문제
  • 입력
  • 예시
  • 샘플 코드

문제

7×77 \times 77×7 크기의 마당에서 두 플레이어가 결투를 진행합니다. 상대를 쓰러뜨리거나 마당 밖으로 밀어내거나, 영맥에서 가호를 모으면 승리합니다.

행과 열은 위에서 아래로, 왼쪽에서 오른쪽으로 각각 111부터 777까지이며, rrr행 ccc열의 칸을 (r,c)(r,c)(r,c)로 표기합니다.

마당에는 가호를 얻을 수 있는 영맥이 한 칸 있습니다. 두 플레이어의 시작 위치와 영맥의 위치는 경기마다 무작위로 정해집니다. 두 플레이어는 서로 다른 칸에서 시작하며, 영맥의 위치는 경기 동안 유지됩니다.

처음에 각 플레이어의 체력은 101010, 가호는 000이며, 모든 기술을 사용할 수 있습니다.

초기 배치의 예시: 플레이어 1 (4,3), 플레이어 2 (4,5), 영맥 (2,4).

초기 배치의 예시: 플레이어 1 (4,3), 플레이어 2 (4,5), 영맥 (2,4).

턴 진행

게임은 최대 606060턴 동안 진행됩니다. 매 턴 두 플레이어는 두 행동을 순서대로 미리 선택합니다. 양쪽의 선택이 끝나면 첫 번째 행동끼리 동시에 처리한 뒤, 두 번째 행동끼리 동시에 처리합니다. 행동 처리 중 승패가 결정되면 즉시 게임을 종료합니다.

두 행동을 마친 뒤 영맥에 서 있는 플레이어는 가호 111을 얻습니다. 가호는 누적됩니다.

오른쪽 이동 → 대기로 영맥에서 턴을 마치면 가호 1을 얻습니다.

오른쪽 이동 → 대기로 영맥에서 턴을 마치면 가호 1을 얻습니다.

행동

방향은 위, 아래, 왼쪽, 오른쪽 중 하나를 선택합니다. 순보는 대각선 네 방향도 선택할 수 있습니다. 정면은 선택한 방향을 의미합니다.

행동 효과 재사용 대기 턴 수
대기 아이콘 대기 아무것도 하지 않습니다. 000
이동 아이콘 이동 선택한 방향으로 한 칸 이동합니다. 000
찌르기 아이콘 찌르기 정면의 첫 번째 칸과 두 번째 칸을 공격하여 피해 222를 줍니다. 111
휩쓸기 아이콘 휩쓸기 정면의 세 칸과 자신의 양옆 두 칸을 공격하여 피해 222를 주고, 상대를 선택한 방향으로 한 칸 밀어냅니다. 222
돌진 아이콘 돌진 한 칸 이동한 뒤 정면의 첫 번째 칸과 두 번째 칸을 공격하여 피해 333을 주고, 상대를 선택한 방향으로 두 칸 밀어냅니다. 222
방어 아이콘 방어 정면의 세 칸과 정면 두 번째 칸에 있는 상대의 공격을 막습니다. 222
파괴 아이콘 파괴 정면의 첫 번째 칸을 공격합니다. 방어를 무시하고 피해 222를 주며, 상대를 선택한 방향으로 한 칸 밀어냅니다. 111
순보 아이콘 순보 선택한 방향으로 정확히 두 칸 이동합니다. 중간 칸의 상대를 통과합니다. 222

공격과 방어 범위는 마당 안의 칸에만 적용합니다.

찌르기 ↑

찌르기 찌르기 아이콘

휩쓸기 ↑

휩쓸기 휩쓸기 아이콘

돌진 ↑

돌진 돌진 아이콘

방어 ↑

방어 방어 아이콘

파괴 ↑

파괴 파괴 아이콘

순보 ↑

순보 순보 아이콘

대기와 이동을 제외한 여섯 행동을 기술이라고 합니다. 기술은 턴 시작에 사용 가능한 경우에만 선택할 수 있으며, 한 턴에 같은 기술은 한 번만 선택할 수 있습니다. 이동과 대기는 두 번 선택할 수 있습니다.

기술을 사용하면 성공 여부와 관계없이 표의 재사용 대기시간이 적용됩니다. 예를 들어 대기시간이 222인 기술을 ttt번째 턴에 사용하면 t+1t+1t+1, t+2t+2t+2번째 턴에는 사용할 수 없으며, t+3t+3t+3번째 턴부터 다시 사용할 수 있습니다.

  • 첫 번째 행동의 이동과 순보는 현재 위치에서 마당 안의 칸으로 향해야 합니다. 두 번째 행동의 이동과 순보는 모든 방향을 선택할 수 있으며, 수행할 때 도착 칸이 마당 밖이면 제자리에 머무릅니다.
  • 돌진의 도착 칸이 마당 밖이면 이동하지 않고 현재 위치에서 공격합니다.

동시 처리

두 플레이어의 행동은 다음 순서로 처리합니다.

순서 행동 처리 규칙
1 순보 아이콘 순보 순보를 처리합니다.
2 방어 아이콘 방어, 찌르기 아이콘 찌르기 방어를 적용하고 찌르기의 명중 여부를 판정합니다. 방어에 막히지 않은 찌르기에 맞은 상대의 이동 행동은 취소됩니다. 방어는 해당 행동을 처리하는 동안 적용됩니다.
3 이동 아이콘 이동, 돌진 아이콘 돌진 이동과 돌진의 이동을 처리합니다.
4 휩쓸기 아이콘 휩쓸기, 돌진 아이콘 돌진, 파괴 아이콘 파괴 이동이 끝난 위치에서 휩쓸기, 돌진, 파괴의 명중 여부를 판정합니다.
5 공격 비교 방어에 막히지 않은 두 공격이 서로 명중하면 피해량을 비교합니다. 피해량이 다르면 더 큰 공격의 피해와 밀기만 적용합니다. 같으면 양쪽 모두 공격 피해를 받지 않고 각 공격의 밀기만 적용합니다.
6 밀기와 체력 밀기와 체력 감소를 처리합니다. 밀기는 한 칸씩 동시에 진행하며, 두 플레이어의 도착 칸이 같으면 양쪽의 남은 밀기를 중단합니다.

각 이동 단계에서 두 플레이어의 도착 칸이 같거나 서로의 위치를 맞바꾸려 하면 둘 다 이동하지 않습니다. 그 단계에서 이동하지 않는 상대가 서 있는 칸으로도 이동할 수 없습니다. 이동이 막힌 돌진은 현재 위치에서 공격합니다.

찌르기 → 대 이동 ↑: 플레이어 2는 이동이 취소되고 체력이 2 감소합니다.

찌르기 찌르기 아이콘 대 이동 이동 아이콘: 플레이어 2는 이동이 취소되고 체력이 2 감소합니다.

돌진 → 대 찌르기 ←: 돌진의 피해 3과 두 칸 밀기만 적용합니다.

돌진 돌진 아이콘 대 찌르기 찌르기 아이콘: 돌진의 피해 3과 두 칸 밀기만 적용합니다.

휩쓸기 → 대 휩쓸기 ←: 양쪽 모두 피해 없이 한 칸씩 밀려납니다.

휩쓸기 휩쓸기 아이콘 대 휩쓸기 휩쓸기 아이콘: 양쪽 모두 피해 없이 한 칸씩 밀려납니다.

승패

승패는 다음 순서로 판정합니다.

  1. 각 행동을 마친 뒤 체력이 000이 되거나 마당 밖으로 밀려난 플레이어는 패배합니다. 같은 행동에서 양쪽 모두 패배 조건을 만족하면 무승부입니다.
  2. 두 행동을 마친 뒤 가호를 얻어 101010이 된 플레이어는 승리합니다.
  3. 606060번째 턴까지 승패가 결정되지 않으면 가호가 더 많은 플레이어가 승리합니다. 가호가 같으면 체력이 더 많은 플레이어가 승리하며, 둘 다 같으면 무승부입니다.

돌진으로 상대를 마당 밖으로 밀어내는 예시.

돌진으로 상대를 마당 밖으로 밀어내는 예시.

상대의 행동을 예측하여 결투의 최종 승자가 되기 위한 AI를 설계해주세요!

입력

게임 시작 시 다음 초기 배치가 두 플레이어에게 한 번 주어집니다.

INIT objective_r objective_c r1 c1 r2 c2

objective_r objective_c는 영맥의 행, 열, r1 c1과 r2 c2는 각각 플레이어 1과 플레이어 2의 시작 행, 열입니다. 좌표는 모두 111부터 777까지의 정수입니다.

채점기는 한 줄씩 다음 명령을 전달합니다.

명령어 입력 출력
INIT 위 형식의 초기 배치 -
READY READY FIRST 또는 READY SECOND OK
TURN 아래 형식의 현재 상태 action1 action2
FINISH FINISH -

FIRST는 플레이어 1, SECOND는 플레이어 2입니다. FINISH를 받거나 입력이 끝나면 프로그램을 종료합니다.

턴 입력

TURN time turn r1 c1 hp1 blessing1 r2 c2 hp2 blessing2 previous_action1 previous_action2
  • time: 남은 총 응답 시간(밀리초).
  • turn: 이번 턴 번호(111부터 606060).
  • r1 c1 hp1 blessing1: 플레이어 1의 현재 행, 열, 체력, 가호.
  • r2 c2 hp2 blessing2: 플레이어 2의 현재 행, 열, 체력, 가호. 입력은 항상 플레이어 1, 플레이어 2 순서입니다.
  • previous_action1 previous_action2: 직전 턴에 상대가 선택한 두 행동. 첫 턴에는 대기, 대기인 0 0입니다.

재사용 대기시간은 자신의 선택과 입력으로 받은 직전 상대 행동으로 추적합니다.

행동 출력

행동 출력 형식
대기 0
이동 1 dir
찌르기 2 dir
휩쓸기 3 dir
돌진 4 dir
방어 5 dir
파괴 6 dir
순보 7 dir

dir은 U(위), R(오른쪽), D(아래), L(왼쪽) 중 하나입니다. 순보는 UR(오른쪽 위), DR(오른쪽 아래), DL(왼쪽 아래), UL(왼쪽 위)도 사용할 수 있습니다. 대기에는 방향을 붙이지 않습니다.

두 행동을 한 줄에 공백으로 구분하여 출력합니다. 예를 들어 1 U 2 R은 위로 이동한 뒤 오른쪽으로 찌르기, 7 UR 0은 오른쪽 위로 순보한 뒤 대기입니다.

제한

  • READY와 모든 TURN 응답에 사용하는 시간의 합은 플레이어마다 총 1,000ms1{,}000\text{ms}1,000ms입니다.
  • 각 응답 끝에 개행문자를 출력하고 버퍼를 flush해야 합니다. 응답 길이는 개행문자를 포함해 128128128바이트 이하여야 합니다.
  • 시간 초과, 잘못된 출력 형식, 합법적이지 않은 행동은 패배로 처리합니다.

예시

영맥이 (2,4)(2,4)(2,4), 플레이어 1이 (4,3)(4,3)(4,3), 플레이어 2가 (4,5)(4,5)(4,5)에서 시작하는 예시입니다.

두 플레이어 모두 다음 초기 입력을 받습니다.

INIT 2 4 4 3 4 5

플레이어 1은 READY FIRST, 플레이어 2는 READY SECOND를 받고 각각 OK를 출력합니다.

첫 턴의 입력과 출력은 다음과 같습니다.

플레이어 1:

TURN 999 1 4 3 10 0 4 5 10 0 0 0
1 U 2 R

플레이어 2:

TURN 999 1 4 3 10 0 4 5 10 0 0 0
1 U 2 L

양쪽 모두 위로 이동한 뒤 서로를 찌릅니다. 피해량이 같아 체력은 모두 101010이며, 위치는 각각 (3,3)(3,3)(3,3)과 (3,5)(3,5)(3,5)가 됩니다.

두 번째 턴의 입력에는 직전 상대 행동이 포함됩니다.

플레이어 1:

TURN 994 2 3 3 10 0 3 5 10 0 1 U 2 L
1 U 0

플레이어 2:

TURN 992 2 3 3 10 0 3 5 10 0 1 U 2 R
1 U 0

이번 턴의 찌르기 쿨다운은 양쪽 모두 111입니다. 두 행동을 처리하면 위치는 각각 (2,3)(2,3)(2,3)과 (2,5)(2,5)(2,5)가 됩니다.

샘플 코드

  • C20 : main.c
  • CPP20 : main.cpp
  • PYTHON3, PYPY3 : main.py

출제

  • lll
    브론즈 Vlll
  • swoon
    브론즈 Vswoon
플레이코드 제출
© 2026 hanpan
개인정보 처리방침

티어 아이콘의 저작권은 solved.ac에 있습니다. 본 서비스는 solved.ac와 무관합니다.