스프링클러 배치

시간 제한1초메모리 제한128 MB

요약
울타리로 나뉜 농장을 허수아리를 피해 트로미노 스프링클러로 덮되 구멍 수는 밭 수를 넘지 않게 합니다.
난이도

보통10점 중 7점

유형
구현, 시뮬레이션, 백트래킹, 그리디
정답자
아직 제출이 없습니다

문제

사라는 직사각형 농장을 가지고 있다. 농장은 5R5R개의 행과 5C5C개의 열로 된 칸 격자이다. 다섯 행마다 가로 울타리가 농장을 가로지르고, 다섯 열마다 세로 울타리가 농장을 가로지른다. 울타리는 농장을 R×CR \times C개의 5×55 \times 5 구역으로 나누며, 각 구역을 밭이라고 부른다.

새와 가뭄이 사라의 주된 걱정이다. 작물을 먹는 새를 막으려고 일부 밭에는 허수아대가 있다. 허수아대는 칸 하나를 차지하고, 한 밭의 허수아대는 없거나 하나이다.

가뭄이 오면 사라는 스프링클러로 작물에 물을 준다. 스프링클러는 주 노즐 하나와 옆 노즐 두 개를 가지고, 정확히 세 칸을 차지하며 그 세 칸에 물을 준다. 옆 노즐 두 칸은 주 노즐과 상하좌우로 맞닿아 있다. 따라서 스프링클러가 덮는 세 칸은 일직선이거나 L자이다.

사라는 허수아대가 없는 모든 칸에 스프링클러 노즐을 정확히 하나씩 두고 싶다. 허수아대가 있는 칸에는 노즐을 두면 안 된다. 농장 밖에도 노즐을 두면 안 된다.

한 스프링클러가 덮는 세 칸은 이웃 밭에 걸칠 수 있다. 그때 사라는 그 스프링클러가 물을 주는, 서로 다른 밭에 속한 두 칸 사이 울타리에 구멍을 뚫어야 한다. 구멍을 뚫는 일은 힘들어서, 구멍은 R×CR \times C개 이하여야 한다.

농장 묘사가 주어지면 위 조건을 만족하는 스프링클러 배치를 출력한다. 가능한 배치는 항상 존재한다.

입력

첫 줄에 정수 RR과 CC가 주어진다. 1≤R,C≤1001 \le R, C \le 100.

이어지는 6R−16R-1개의 줄은 각각 6C−16C-1개의 문자이다. 밭과 밭 사이 울타리를 나타낸다. 울타리는 실제로는 두께가 없지만 입력에서는 문자로 적는다.

칸 하나는 문자 하나이다. 점 .은 빈 칸이고, #(ASCII 35)은 허수아대이다. 세로 울타리는 |(ASCII 124), 가로 울타리는 -, 울타리 교차점은 +이다.

출력

입력과 같은 크기의 격자를 출력한다. 울타리 구멍은 밑줄 _로 표시한다. 입력의 빈 칸 .은 소문자 a부터 z로 바꾸되 다음 규칙을 지킨다.

  1. 같은 스프링클러가 물을 주는 세 칸은 같은 글자이다. 세 칸이 한 밭에 있지 않아도 된다.
  2. 같은 밭에서 서로 다른 스프링클러가 물을 주는 이웃 칸은 다른 글자이다.
  3. 서로 다른 밭에서 서로 다른 스프링클러가 물을 주고, 그 사이 울타리에 구멍이 있으면 그 이웃 칸은 다른 글자이다.
  4. 서로 다른 밭의 이웃 칸은 앞 규칙을 지키는 한 같은 글자를 써도 된다.

올바른 배치가 여러 개이면, 밭을 뱀 모양 순서로 처리한 배치를 출력한다. 행 번호는 00부터이고, 짝수 행은 왼쪽에서 오른쪽, 홀수 행은 오른쪽에서 왼쪽이다. 아직 덮지 않은 빈 칸 수가 33의 배수가 아닌 밭에서는 그 순서의 다음 이웃 밭으로 칸을 넘기도록 구멍 하나를 뚫고 스프링클러 하나를 걸친다. 각 밭의 나머지 칸은 가장 위, 같은 행이면 가장 왼쪽 빈 칸부터 덮는다. 스프링클러에는 놓은 순서대로, 이미 붙인 이웃 스프링클러와 겹치지 않는 가장 앞 소문자를 붙인다. 샘플 입력에 대해서는 샘플 출력을 그대로 출력한다.

힌트

허수아대가 없는 5×55 \times 5 밭은 칸이 2525개라서 세 칸짜리 스프링클러만으로 덮이지 않는다. 울타리에 구멍을 뚫어 이웃 밭과 스프링클러를 나눠야 한다. 허수아대가 있는 밭은 빈 칸이 2424개이므로 그 밭 안에서만 덮을 수 있다.

예제3

  1. 예제 1

    입력
    2 2
    .....|.....
    .....|.....
    ...#.|.....
    .....|.....
    .....|.....
    -----+-----
    .....|.....
    .....|.....
    .....|.....
    .....|.....
    .....|.....
    
    예상 출력
    aaacc|dxxxa
    bbbce|dyyya
    ddd#e|dzzza
    ccbae|fccbb
    cbbaa|ffcdb
    -----+---_-
    ssrrr|tttdd
    saaax_xxeee
    yxbbb|zdaaa
    yxccc|zdbbb
    yxddd|zdccc
    
  2. 예제 2

    입력
    1 1
    .....
    .....
    ..#..
    .....
    .....
    
    예상 출력
    aabba
    acbca
    bc#ca
    bcacb
    baabb
    
  3. 예제 3

    입력
    1 1
    #....
    .....
    .....
    .....
    .....
    
    예상 출력
    #aabb
    bacba
    bccda
    badda
    aabbb