샤워실 바닥 깔기 (Small)

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

요약
2^K × 2^K 격자에서 배수구 한 칸을 비워 두고 L자 타일로 덮되, 인쇄 순서에서 번호가 사전순으로 가장 작게 나오는 배치를 구한다.
난이도

보통10점 중 7점

유형
분할 정복, 재귀, 구현
정답자
아직 제출이 없습니다

문제

민규가 훈련소에 입소한 첫날, 교관이 민규를 불러 샤워실 바닥을 다시 깔라고 했다. 먼저 바닥을 깐 사람이 배수구 자리까지 타일로 막아버렸기 때문이다.

샤워실 바닥은 정사각형이고 한 변의 길이는 2의 거듭제곱이다. 앞사람은 2×22 \times 2 크기의 정사각형 타일만 써서 바닥을 전부 덮었는데, 이 타일로는 배수구 자리 한 칸만 비워 둘 수 없다. 그래서 민규는 네 칸짜리 정사각형 타일 대신 세 칸을 차지하는 ㄱ자 타일을 쓰기로 했다. ㄱ자 타일은 2×22 \times 2 정사각형에서 한 칸을 뺀 모양이고, 90도씩 돌려서 네 방향 중 어느 방향으로든 놓을 수 있다.

바닥의 크기와 배수구의 위치가 주어진다. 배수구 칸만 비워 두고 나머지 칸을 ㄱ자 타일로 겹치지 않게 빈틈없이 덮는 방법을 찾아라. 타일은 바닥 밖으로 나갈 수 없다.

입력

첫째 줄에 자연수 KK가 주어진다 (1≤K≤21 \le K \le 2). 바닥의 한 변의 길이는 2K2^K이다.

둘째 줄에 배수구의 위치를 나타내는 두 자연수 xx와 yy가 공백으로 구분되어 주어진다 (1≤x,y≤2K1 \le x, y \le 2^K). 가장 왼쪽 아래 칸이 (1,1)(1, 1)이고 가장 오른쪽 위 칸이 (2K,2K)(2^K, 2^K)이다.

출력

2K2^K개의 줄을 출력한다. ii번째 줄에는 y=2K+1−iy = 2^K + 1 - i인 가로줄을 x=1x = 1부터 x=2Kx = 2^K까지 왼쪽에서 오른쪽으로, 값 사이를 공백 하나로 구분해 출력한다. 즉 위쪽 줄을 먼저 출력한다. 배수구 칸에는 -1을 출력하고, 나머지 칸에는 그 칸을 덮는 타일의 번호를 출력한다.

타일 배치는 여러 가지가 나올 수 있으므로 다음 규칙으로 답 하나를 정한다. 먼저 출력하는 순서대로, 즉 위쪽 줄부터 각 줄에서는 왼쪽부터 칸을 훑으면서 아직 번호가 없는 타일을 만날 때마다 11번부터 차례대로 번호를 붙인다. 타일은 모두 (4K−1)/3(4^K - 1) / 3개이므로 번호는 11부터 (4K−1)/3(4^K - 1) / 3까지 쓴다. 이렇게 번호를 붙였을 때, 출력할 숫자를 출력 순서대로 이어 붙인 수열이 사전순으로 가장 작은 배치를 출력한다.

덮는 방법이 존재하지 않으면 -1만 출력한다.

예제3

  1. 예제 1

    입력
    1
    2 2
    
    예상 출력
    1 -1
    1 1
    
  2. 예제 2

    입력
    2
    1 1
    
    예상 출력
    1 1 2 2
    1 3 3 2
    4 4 3 5
    -1 4 5 5
    
  3. 예제 3

    입력
    2
    3 2
    
    예상 출력
    1 1 2 2
    1 3 3 2
    4 3 -1 5
    4 4 5 5