ASCII 퍼즐 맞추기
시간 제한1초메모리 제한128 MB
들쭉날쭉한 경계를 가진 뒤섞인 조각 k개를 원래 직사각형으로 맞추고 사전 순으로 가장 작은 배치를 출력합니다.
문제
필리와 플로이가 퍼즐 놀이를 한다. 필리는 정사각형 칸이 격자로 그려진 직사각형 종이를 격자선을 따라 여러 조각으로 자르고, 조각을 돌리지 않은 채로 잘 섞어 놓는다. 플로이는 조각을 돌리지 않고 원래 직사각형으로 되돌려 놓아야 한다.
필리는 퍼즐이 제대로 만들어지도록 다음 규칙을 지키며 종이를 자른다. 먼저 정수 , , 을 고르고, 원래 종이의 너비를 칸, 높이를 칸으로 잡는다. 플로이는 와 는 알지만 , , 는 모른다. 이렇게 하면 원래 종이를 너비 칸, 높이 칸인 직사각형 개로 나누는 자명한 퍼즐을 만들 수 있는데, 인 자명한 퍼즐은 이 놀이에서 제대로 된 퍼즐로 보지 않는다. 실제로 자르는 조각은 이 직사각형을 바탕으로 하면서, 이웃한 조각 사이의 경계를 들쭉날쭉하게 만든 모양이다. 원래 종이를 자른 조각은 다음 조건을 모두 만족한다.
- 조각은 개다.
- 각 조각은 구멍이 없고 상하좌우로 이어진 하나의 영역이다.
- 원래 종이의 모든 칸은 정확히 한 조각에 속한다.
- 각 조각은 자명한 퍼즐에서 대응하는 직사각형의 네 꼭짓점 칸을 포함한다.
- 각 조각의 칸은 대응하는 직사각형의 칸, 그 직사각형에 맞닿은 칸, 이웃한 직사각형의 내부 칸에서만 나온다.
- 이웃한 두 조각을 자른 선은 직선일 수 없다. 원래 종이의 테두리에 닿는 조각만 곧은 변이 있다.
이 조건에서 각 조각은 칸 직사각형 안에 들어간다. 그래서 각 조각은 대응하는 직사각형이 정확히 가운데에 오도록 격자로 주어진다.
예를 들어 , , 이면 원래 종이는 칸이고, 자명한 퍼즐은 직사각형 개로 나뉜다. 가운데 직사각형에 대응하는 조각은 그 직사각형의 네 꼭짓점 칸을 반드시 포함하고, 나머지 칸은 그 직사각형에 맞닿은 칸이나 이웃 직사각형의 내부 칸에서만 온다. 이 조각을 담는 격자는 이다. 종이의 오른쪽 위 끝에 있는 조각도 같은 방식으로 주어진다.
플로이가 퍼즐을 맞추도록 도와주는 프로그램을 작성하시오.
입력
첫째 줄에 정수 , , 가 주어진다. 는 퍼즐 조각의 개수이고, 와 는 자명한 퍼즐 조각의 너비와 높이다. (인 에 대해 , )
다음으로 조각 개의 모양이 주어진다. 각 조각은 문자 개로 이루어진 줄 개로 주어진다. 조각에는 앞에서부터 차례로 대문자 알파벳이 붙는다. 첫 번째 조각은 'A', 두 번째 조각은 'B'와 같은 식이다. 한 조각의 모양에는 문자 두 종류만 나온다. 그 조각의 알파벳은 조각에 속하는 칸을 뜻하고, 점('.')은 속하지 않는 칸을 뜻한다.
조각과 조각 사이는 빈 줄로 구분한다.
출력
첫째 줄에 원래 종이의 크기 와 를 출력한다. 다음 개 줄에는 줄마다 대문자 알파벳 개를 출력해 퍼즐을 맞춘 결과를 나타낸다. 각 알파벳은 그 칸이 속한 조각을 뜻한다.
퍼즐을 맞추는 방법이 여러 가지면 사전순으로 가장 앞서는 방법을 출력한다. 두 방법을 비교할 때는 각 방법의 개 줄을 위에서 아래로 이어 붙여 길이 인 문자열을 만들고, 두 문자열을 사전순으로 비교한다.
입력은 언제나 위 규칙대로 자른 퍼즐이므로 맞추는 방법이 적어도 하나 있다.