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

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

유역 나누기 (Large)

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

요약
각 칸의 물이 가장 낮은 이웃으로 흘러 싱크에 모이고, 같은 싱크로 흐르는 칸을 한 유역으로 묶은 뒤 행 우선 문자열이 가장 작아지도록 유역에 알파벳을 붙인다.
난이도

보통10점 중 5점

유형
그래프, DFS, 유니온 파인드, 구현
정답자
아직 제출이 없습니다

문제

지질학자는 빗물이 흘러내리는 방향에 따라 땅을 여러 구역으로 나눈다. 이렇게 나눈 구역을 배수 유역이라고 한다.

각 칸의 고도를 담은 2차원 배열, 즉 고도 지도가 주어진다. 같은 배수 유역에 속한 칸이 같은 이름표를 받도록 지도의 모든 칸에 이름표를 붙여야 한다. 규칙은 다음과 같다.

  • 한 칸의 물은 인접한 네 칸 중 최대 한 칸으로 흘러내린다.
  • 어떤 칸에 인접한 네 칸 가운데 그 칸보다 고도가 낮은 칸이 하나도 없으면 물은 흐르지 않는다. 이런 칸을 싱크라고 한다.
  • 그렇지 않으면 물은 인접한 칸 중 고도가 가장 낮은 칸으로 흐른다.
  • 고도가 가장 낮은 인접한 칸이 여럿이면 북, 서, 동, 남 순서에서 먼저 오는 방향을 고른다.

직접 또는 다른 칸을 거쳐 같은 싱크로 흘러드는 칸은 모두 같은 배수 유역에 속한다. 유역마다 서로 다른 알파벳 소문자 하나를 이름표로 붙이는데, 지도의 각 행을 위에서 아래로 이어 붙인 문자열이 사전순으로 가장 앞서도록 붙인다. 그래서 가장 북서쪽 칸이 속한 유역의 이름표는 항상 'a'다.

입력

첫째 줄에 지도의 개수 TT가 주어진다. 이어서 지도 TT개가 주어진다. 각 지도의 첫째 줄에는 지도의 높이 HH와 너비 WW가 칸 수로 주어진다. 다음 HH개의 줄에는 북쪽 행부터 남쪽 행까지 한 줄에 한 행씩 주어지고, 각 줄에는 서쪽 칸부터 동쪽 칸까지 고도 WW개가 공백으로 구분되어 주어진다.

  • 1≤T≤1001 \le T \le 100
  • 1≤H≤1001 \le H \le 100, 1≤W≤1001 \le W \le 100
  • 고도는 00 이상 1000010000 미만의 정수다.
  • 한 지도의 배수 유역은 최대 26개다.

출력

지도마다 H+1H+1개의 줄을 출력한다. 첫 줄은 다음 형식으로 출력한다.

Case #X:

여기서 XX는 지도의 번호이고 1부터 시작한다. 이어지는 HH개의 줄에는 입력에 나온 것과 같은 순서로 각 칸의 유역 이름표를 출력한다. 한 줄 안의 이름표는 공백 하나로 구분한다.

힌트

첫 번째 예제의 첫 지도에서는 북동쪽 모서리와 남서쪽 모서리가 싱크다. 대각선에 놓인 칸의 물은 고도가 더 낮은 쪽(6이 아니라 5)으로 흐르므로 남서쪽 싱크로 흘러든다.

예제1

  1. 예제 1

    입력
    5
    3 3
    9 6 3
    5 9 6
    3 5 9
    1 10
    0 1 2 3 4 5 6 7 8 7
    2 3
    7 6 7
    7 6 7
    5 5
    1 2 3 4 5
    2 9 3 9 6
    3 3 0 8 7
    4 9 8 9 8
    5 6 7 8 9
    2 13
    8 8 8 8 8 8 8 8 8 8 8 8 8
    8 8 8 8 8 8 8 8 8 8 8 8 8
    
    예상 출력
    Case #1:
    a b b
    a a b
    a a a
    Case #2:
    a a a a a a a a a b
    Case #3:
    a a a
    b b b
    Case #4:
    a a a a a
    a a b b a
    a b b b a
    a b b b a
    a a a a a
    Case #5:
    a b c d e f g h i j k l m
    n o p q r s t u v w x y z