아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

Overdose Runner

시간 제한2초메모리 제한1024 MB

요약
격자 위에서 전투, 레벨업, 과다복용 상태를 처리하며 주어진 행동 순서를 그대로 시뮬레이션하고 최종 상태를 출력한다.
난이도

보통10점 중 4점

유형
시뮬레이션, 구현, 배열
정답자
아직 제출이 없습니다

문제

스킵이는 신작 게임 Overdose Runner를 플레이하고 있다. 게임의 목표는 플레이어가 특정 지점에 도착하는 것이다. 이 게임은 N×MN\times M 크기의 2차원 좌표계로 나타낼 수 있다. 좌표 안에는 플레이어, 빈칸, 몬스터, 장애물, 목적지가 존재한다. 플레이어는 공격력, 공격 사거리, 이동속도, 레벨, 경험치, 요구 경험치 6가지의 능력치를 가진다. 플레이어는 행동력을 소모해 특정 행동을 할 수 있는데 그 행동은 아래와 같다.

  • 순간이동 - 행동력 1을 소모해 상하좌우 중 한 방향을 정해 정확히 pp만큼 떨어진 위치로 이동한다. 이때 pp는 캐릭터의 이동속도다. 이동할 위치가 좌표 범위 밖이거나 장애물 혹은 몬스터가 있으면 움직일 수 없다.
  • 대기 - 행동력 1을 소모해 아무 행동도 하지 않는다.
  • 공격 - 행동력 3을 소모해 상하좌우 중 한 방향으로 투사체를 발사한다. 투사체는 발사된 방향으로 공격 사거리만큼의 거리를 한 칸씩 움직이며 투사체와 몬스터가 같은 위치에 있게 되면 몬스터의 체력이 (플레이어의 공격력 - 몬스터의 방어력)만큼 감소한다. 단, 플레이어의 공격력이 몬스터의 방어력보다 낮은 경우 몬스터의 체력은 감소하지 않는다. 만약 이 행동으로 인해 몬스터의 체력이 0 이하가 되면 그 자리는 빈칸이 되고 플레이어는 경험치를 획득한다. 투사체가 이동할 다음 좌표에 장애물이 있는 경우 투사체는 사라진다. 투사체가 사라진 후 다음 행동을 처리한다. 투사체는 장애물을 제외한 다른 물체를 만나도 사라지거나 행동을 멈추지 않는다.
  • 약 먹기 - 행동력 2를 소모해 이동속도가 1 증가 혹은 감소하는 약을 먹는다. 이동속도가 0인 경우 음수로 내려가지 않는다. 이때 행동력은 그대로 소모된다. 약을 5번 먹을 때마다 OVERDOSE 상태가 되며 OVERDOSE 상태에서는 순간이동, 대기를 제외한 다른 행동을 할 수 없다. OVERDOSE 상태가 된 후 행동력을 10 이상 소모할 경우 OVERDOSE 상태는 해제된다.
  • 클리어 - 플레이어가 목적지와 같은 좌표에 있으면 행동력 0을 소모해 스테이지를 클리어한다. 게임을 클리어한 후 캐릭터는 다른 행동을 할 수 없다.

한 가지 행동이 끝난 후 경험치를 얻어 요구 경험치 이상이 되면, 경험치 < 요구 경험치를 만족할 때까지 레벨이 상승하고 경험치를 요구 경험치만큼 뺀다.

캐릭터는 게임을 처음 시작했을 때 공격력 5, 공격 사거리 1, 이동속도 1, 요구 경험치 10, 경험치 0, 레벨 1로 시작하며 레벨이 ll일 때 레벨이 상승하면 레벨이 l+1l+1이 되고, 공격력이 ll만큼, 공격 사거리가 1만큼, 요구 경험치가 10만큼 증가한다.

스킵이가 게임을 시작한 후 한 행동이 차례대로 주어진다. 만약 스킵이가 한 행동이 불가능한 행동이었을 경우 게임은 그 행동을 무시하고 다음 행동을 실행한다. 이 때 행동력은 소모되지 않는다. 모든 행동을 실행한 뒤 게임 화면을 출력해보자!

입력

첫 번째 줄에 NN, MM이 공백으로 구분되어 주어진다. (5≤N,M≤50)(5 \leq N, M \leq 50)

그 다음 줄부터 NN개의 줄에는 초기 게임의 상태를 나타내는 MM개의 문자가 주어진다. p는 플레이어, .은 빈칸, m은 몬스터, *은 장애물, g는 목적지를 나타낸다. p와 g는 하나만 주어지며 m은 하나 이상 주어진다. yy 좌표가 00 혹은 N−1N-1이거나 xx 좌표가 00 혹은 M−1M-1인 경우 장애물이 있다는 것이 보장된다.

그 다음 줄에는 몬스터의 수 kk가 주어진다. (1≤k≤N×M)(1 \leq k \leq N \times M) kk는 주어진 mm의 개수와 같다.

ii번째 몬스터는 몬스터의 좌표를 yy 좌표가 같다면 xx 좌표가 증가하는 순서대로, yy 좌표가 다르다면 yy 좌표가 증가하는 순서대로 정렬했을 때 ii번째에 오는 몬스터다.

그 다음 줄에는 각 몬스터의 체력 mh_imh\_i이 공백으로 구분되어 주어진다. (1≤mh_i≤50)(1 \leq mh\_i \leq 50)

그 다음 줄에는 각 몬스터의 방어력 md_imd\_i이 공백으로 구분되어 주어진다. (1≤md_i≤50)(1 \leq md\_i \leq 50)

그 다음 줄에는 각 몬스터의 체력을 0 이하로 만들었을 경우 얻을 수 있는 경험치 mexp_imexp\_i가 공백으로 구분되어 주어진다. (1≤mexp_i≤50)(1 \leq mexp\_i \leq 50)

좌표는 맵에서 왼쪽 위가 (0,0)(0,0)이고 오른쪽 아래가 (N−1,M−1)(N-1,M-1)이라 가정한다.

그 다음 줄에는 스킵이가 한 행동의 수 ss가 주어진다. (1≤s≤50)(1 \leq s \leq 50)

그 다음 줄에는 스킵이가 한 행동이 공백으로 구분되어 주어지는데 u는 위로 순간이동, d는 아래로 순간이동, l은 왼쪽으로 순간이동, r은 오른쪽으로 순간이동, w는 대기, au는 위로 공격, ad는 아래로 공격, al는 왼쪽으로 공격, ar는 오른쪽으로 공격, du는 약 먹기(이동속도 1 증가), dd는 약 먹기(이동속도 1 감소), c는 클리어를 나타낸다.

출력

첫 번째 줄에 레벨과 경험치를 공백으로 구분하여 출력한다.

그 다음 줄에 스킵이가 사용한 행동력을 출력한다.

그 다음 줄부터 NN개의 줄에 모든 행동이 끝난 후 게임판의 상태를 입력 형식에 맞춰서 출력한다. 만약 목적지와 플레이어가 같은 위치에 있었을 경우 p만 출력한다.

그 다음 줄에는 남아있는 몬스터의 체력을 공백으로 구분하여 출력한다. 만약 몬스터가 하나도 남아있지 않았을 경우 출력하지 않는다. 몬스터의 순서는 yy 좌표가 같다면 xx 좌표가 증가하는 순서대로 yy 좌표가 다르다면 yy 좌표가 증가하는 순서대로 출력한다.

예제3

  1. 예제 1

    입력
    5 5
    *****
    *p.g*
    *.m.*
    *...*
    *****
    1
    10
    1
    10
    18
    u c u d d u l r r d d l l r u c l l
    
    예상 출력
    1 0
    6
    *****
    *..g*
    *.m.*
    *p..*
    *****
    10
    
  2. 예제 2

    입력
    6 10
    **********
    *...m....*
    *p..m....*
    *......g.*
    *........*
    **********
    2
    10 15
    3 5
    10 10
    25
    r r ar ar ar u ar ar ar d r d r r u u al al d r al al al al al
    
    예상 출력
    2 0
    50
    **********
    *........*
    *...m.p..*
    *......g.*
    *........*
    **********
    10
    
  3. 예제 3

    입력
    5 5
    *****
    *.m.*
    *p..*
    *..g*
    *****
    1
    10
    1
    3
    15
    du dd du r dd u du al al al d c u w w
    
    예상 출력
    1 0
    16
    *****
    *.mp*
    *...*
    *..g*
    *****
    10