크로스워드 내부자
시간 제한1초메모리 제한128 MB
단어 목록과 십자말풀이 격자 틀이 주어질 때, 각 단어가 빈 칸의 한 구간을 정확히 채우도록 배치할 수 있는지 판정하고 사전순으로 가장 작은 완성 격자를 출력한다.
문제
어느 신문사에 내부 제보자가 있어, 크로스워드 퍼즐의 정답 단어 목록을 당신에게 보내 줍니다. 다만 이 목록은 각 단어가 어느 자리에 들어가는지는 알려 주지 않으며, 대체로 정확하지만 가끔 오류나 누락이 있을 수 있습니다. 단어 목록과 크로스워드 격자의 모양이 주어질 때, 모든 단어를 격자에 배치하여 퍼즐 전체를 채울 수 있는지 판정하고, 가능하다면 완성된 격자를 출력하세요.
입력
입력은 하나 이상의 문제 세트로 이루어집니다.
각 문제 세트는 두 정수 과 이 적힌 줄로 시작합니다. 이고 인 줄은 입력의 끝을 의미하며 처리하지 않습니다. 은 배치할 단어의 개수로 이고, 은 격자의 행 수로 입니다.
이어서 개의 줄에 각각 단어 하나가 왼쪽 정렬로 주어집니다. 모든 단어는 알파벳 문자로만 이루어지고 길이는 이상 이하이며, 한 문제 세트 안에서 같은 단어가 두 번 나오지는 않습니다.
그다음 개의 줄에 격자 틀이 .과 # 문자만으로 왼쪽 정렬되어 주어집니다. 모든 줄의 길이는 서로 같으며 이상 이하입니다. .은 글자를 쓸 수 있는 칸을, #은 글자를 쓸 수 없는 칸을 뜻합니다.
출력
각 단어는 가로(왼쪽에서 오른쪽) 또는 세로(위에서 아래)로 놓여, . 칸이 연속으로 이어진 최대 구간 하나를 정확히 가득 채워야 합니다. 모든 . 칸은 채워져야 하고 # 칸에는 글자가 들어갈 수 없습니다. 가로 단어와 세로 단어는 공통 칸에서 서로 교차할 수 있지만, 두 가로 단어(또는 두 세로 단어)는 사이에 #이 하나도 없이 맞닿거나 겹칠 수 없습니다. 목록의 각 단어는 정확히 한 번씩 사용합니다.
각 문제 세트에 대해 먼저 Problem 과 문제 세트 번호(입력에 나온 순서대로 번부터)를 출력합니다.
- 유효한 배치가 존재하지 않으면 같은 줄에 이어서
: No layout is possible.을 출력합니다. - 그렇지 않으면 다음 개의 줄에 완성된 격자를 출력합니다. 즉 틀에서 모든
.을 그 자리에 놓인 글자로 바꾸고#은 그대로 둡니다. 유효한 배치가 둘 이상이면 사전순으로 가장 작은 완성 격자를 출력합니다. 두 격자는 모든 행을 위에서 아래로, 각 행 안에서는 왼쪽에서 오른쪽으로(#문자 포함) 읽어 비교하며, 더 작은 쪽을 택합니다.