뱀

시간 제한4초메모리 제한64 MB

요약
장애물이 있는 격자에서 뱀들이 직진하고, 막히면 오른쪽과 왼쪽으로 도는 규칙을 따라 T초 동안 이동한 뒤의 배치를 구합니다.
난이도

보통10점 중 5점

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

문제

N×NN \times N 크기의 격자판 위를 뱀 몇 마리가 기어간다. 각 뱀은 두 칸 이상으로 이루어진 칸의 열을 차지하고, 열에서 연속한 두 칸은 변을 맞대고 있다. 열의 첫 칸을 머리라고 한다. 한 칸에는 뱀이 최대 한 마리만 있다. 처음에 뱀이 차지하지 않은 칸은 빈 칸이거나 장애물이 놓인 칸이다.

뱀은 한 걸음마다 먼저 머리를 인접한 빈 칸으로 옮기고, 그다음 꼬리를 당겨 한 칸을 비운다. 처음 진행 방향은 머리와 열에서 두 번째 칸의 위치 관계로 정해진다. 각 걸음에서 뱀은 다음 규칙을 따른다.

  • 앞으로 갈 수 있으면, 즉 장애물이나 다른 뱀이나 자기 몸에 부딪히지 않고 판을 벗어나지도 않으면 앞으로 간다.
  • 앞으로 갈 수 없으면 오른쪽으로 꺾으려 한다.
  • 그것도 불가능하면 왼쪽으로 꺾으려 한다.
  • 그것도 불가능하면 제자리에 머무르고, 다음 걸음에서 다시 앞으로 가려 한다.

오른쪽과 왼쪽은 뱀이 지금 향한 방향을 기준으로 정한다. 꺾어서 움직이면 그 방향이 새로운 진행 방향이 되고, 제자리에 머무르면 방향은 그대로다.

머리가 옮겨 갈 칸은 판단하는 그 순간에 비어 있어야 한다. 꼬리는 머리를 옮긴 뒤에 당기므로 꼬리 끝이 있는 칸은 아직 비어 있지 않고, 따라서 머리는 자기 꼬리 끝 칸으로 들어가지 못한다.

판 위의 뱀은 영어 알파벳으로 구분한다. 한 걸음마다 모든 뱀이 알파벳 순서로 차례차례 위 규칙에 따라 움직인다. 같은 걸음에서 먼저 움직인 뱀이 비운 칸은 나중에 움직이는 뱀이 쓸 수 있다. 한 걸음은 정확히 1초가 걸린다. 뱀의 처음 배치가 주어질 때 TT초가 지난 뒤의 배치를 구하는 프로그램을 작성하라.

입력

첫 줄에 정수 NN과 TT가 주어진다. 2≤N≤10002 \le N \le 1000, 1≤T≤1061 \le T \le 10^6이다. NN은 판의 한 변의 길이이고, TT는 뱀의 배치를 구할 시각이다.

다음 NN개 줄에는 각각 NN개의 문자가 주어진다. 이 줄은 뱀과 빈 칸과 장애물의 처음 배치를 나타내며, 각 문자는 다음 중 하나다.

  • . : 빈 칸
  • # : 장애물이 있는 칸
  • 영어 대문자 : 뱀의 머리가 있는 칸
  • 영어 소문자 : 뱀의 머리가 아닌 부분이 있는 칸

같은 알파벳이 적힌 칸은 대소문자를 가리지 않고 모두 한 뱀을 이룬다. 한 뱀을 이루는 각 칸은 그 뱀의 다른 칸과 정확히 두 칸 인접하고, 머리와 꼬리 끝만 정확히 한 칸과 인접한다. 같은 알파벳으로 표시된 서로 다른 뱀은 없다.

출력

NN개 줄에 각각 NN개의 문자를 출력한다. 이 줄은 TT초가 지난 뒤의 배치를 입력과 같은 형식으로 나타내야 한다.

예제2

  1. 예제 1

    입력
    4 8
    .bB.
    ....
    a.#.
    aaA.
    
    예상 출력
    .baa
    .BAa
    ..#.
    ....
    
  2. 예제 2

    입력
    7 100000
    aA.....
    a#####D
    aa....d
    ......d
    ......d
    ......d
    .......
    
    예상 출력
    aaaaADd
    .#####d
    ......d
    ......d
    .......
    .......
    .......