RPG 메이커

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

요약
홀수 좌표에 놓인 도시들로 이루어진 희소 격자에서 정해진 해밀턴 사이클 순서를 따라 마지막 도시에서 자른 뒤, 그 경로를 도로로 표시하는 문제이다.
난이도

보통10점 중 4점

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

문제

RPG의 맵을 만들려고 한다. 맵은 HH행 WW열의 격자이고, 각 칸에는 다음 네 기호 중 하나가 들어간다.

  • @: 시작 칸. 이야기는 이 칸에서 시작한다.
  • *: 도시 칸. 이야기는 이 칸을 지나가거나 이 칸에서 끝난다.
  • #: 길 칸.
  • .: 빈 칸.

시작 칸과 모든 도시 칸은 입력 조건에 맞게 이미 놓여 있고, 길 칸은 아직 하나도 놓이지 않았다. 어떤 빈 칸을 길 칸으로 바꿀지 정해야 한다.

맵에는 여정이 하나 있어야 한다. 이야기가 갈라지면 안 되므로 여정도 갈라지면 안 된다. 여정은 다음 조건을 모두 만족하는 칸의 나열이다.

  1. 여정에 들어가는 도시 칸의 개수가 최대이다.
  2. 여정은 빈 칸이 아닌 서로 다른 칸으로만 이루어진다.
  3. 여정은 시작 칸에서 시작한다.
  4. 여정은 도시 칸에서 끝난다.
  5. 모든 길 칸이 여정에 들어간다. 여정 밖에 놓인 길 칸은 없다.
  6. 여정의 첫 칸과 마지막 칸을 뺀 나머지 칸은 여정에 속한 칸과 변을 정확히 두 개 맞댄다. 첫 칸과 마지막 칸은 여정에 속한 칸과 변을 정확히 하나 맞댄다.
  7. 도시를 방문하는 순서는 상관없다.

빈 칸은 몇 개든 길 칸으로 바꿀 수 있다. 완성한 맵을 출력한다.

입력

입력은 다음 형식의 테스트 케이스 하나로 주어진다.

H W
S1
S2
...
SH

첫 줄에 정수 HH와 WW가 주어진다. H=4n−1H = 4n - 1, W=4m−1W = 4m - 1을 만족하는 양의 정수 nn과 mm이 있으며, 1≤n,m≤101 \le n, m \le 10이다. 이어지는 HH개의 줄은 길 칸이 없는 맵이다. i+1i+1번째 줄은 길이가 WW인 문자열 SiS_i이다. SiS_i의 jj번째 문자는 ii와 jj가 모두 홀수이면 *, @, . 중 하나이고, 그렇지 않으면 .이다. 격자에 @는 정확히 하나 있고, 도시 칸은 하나 이상 있다.

출력

조건을 만족하는 맵은 여러 개일 수 있으므로, 아래 방법으로 만든 맵만 정답으로 인정한다.

행은 위에서부터 11번부터 HH번까지, 열은 왼쪽에서부터 11번부터 WW번까지 번호를 매긴다. 행 번호와 열 번호가 모두 홀수인 칸을 정점이라고 부르고, 2i+12i+1행 2j+12j+1열의 칸을 정점 (i,j)(i, j)라고 쓴다. 여기서 0≤i<2n0 \le i < 2n이고 0≤j<2m0 \le j < 2m이다. 두 정점의 좌표가 한쪽에서만 11 차이 나면 두 정점은 서로 이웃이고, 그 사이에 있는 칸 하나가 두 정점을 잇는 칸이다.

정점 4nm4nm개를 한 번씩 지나는 순환 CC를 다음 순서로 적는다.

  1. (0,0),(0,1),…,(0,2m−1)(0, 0), (0, 1), \ldots, (0, 2m-1)
  2. 이어서 i=1i = 1부터 i=2n−1i = 2n-1까지 차례로, ii가 홀수면 (i,2m−1),(i,2m−2),…,(i,1)(i, 2m-1), (i, 2m-2), \ldots, (i, 1)을, ii가 짝수면 (i,1),(i,2),…,(i,2m−1)(i, 1), (i, 2), \ldots, (i, 2m-1)을 적는다.
  3. 이어서 (2n−1,0)(2n-1, 0)
  4. 이어서 (2n−2,0),(2n−3,0),…,(1,0)(2n-2, 0), (2n-3, 0), \ldots, (1, 0)

CC에서 연달아 적힌 두 정점은 실제로 이웃이고, 마지막 정점 (1,0)(1, 0)과 첫 정점 (0,0)(0, 0)도 이웃이다.

@가 있는 정점에서 출발해 CC에 적힌 순서대로 나아간다. 끝에 닿으면 처음으로 돌아가고, 정점 4nm4nm개를 모두 한 번씩 지나면 멈춘다. 이렇게 얻은 나열을 마지막 도시 정점 바로 뒤에서 자른다. 남은 정점과 연달아 놓인 두 정점을 잇는 칸이 여정이다.

HH개의 줄에 맵을 출력한다. 여정에 속한 칸 중 입력에서 빈 칸이었던 칸은 #로 바꾸고, 나머지 칸은 입력 그대로 둔다. 이 방법으로 만든 여정은 도시 칸을 모두 지난다.

예제2

  1. 예제 1

    입력
    11 7
    .......
    .......
    *.....*
    .......
    ..@....
    .......
    *......
    .......
    ....*..
    .......
    .......
    
    예상 출력
    #######
    #.....#
    *.....*
    #......
    #.@####
    #.....#
    *.#####
    #.#....
    #.##*##
    #.....#
    #######
    
  2. 예제 2

    입력
    7 11
    ........*..
    ...........
    ...........
    ...........
    ....*...*..
    ...........
    ..*.@...*..
    
    예상 출력
    ########*##
    #.........#
    #.#########
    #.#........
    #.##*###*##
    #.........#
    ##*#@...*##