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

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

상자 눕히기

시간 제한1초메모리 제한128 MB

요약
n by n 창고 바닥에 선 상자를 순서와 방향을 정해 겹치거나 밖으로 나가지 않게 모두 눕힐 수 있는지 판단합니다.
난이도

보통10점 중 7점

유형
백트래킹, 완전 탐색, 시뮬레이션
정답자
아직 제출이 없습니다

문제

어떤 제조 회사는 제품을 상자에 담아 출고할 때까지 정사각형 창고에 보관한다. 상자는 모두 1×1×z1 \times 1 \times z 미터인 직육면체이고, zz는 1<z<301 < z < 30인 정수다. 처음에는 모든 상자가 긴 변을 세운 채 창고 벽과 나란히 놓여 있어서 상자 하나가 바닥의 한 칸만 차지한다.

창고 관리자는 상자를 세고 확인하려고 상자마다 한 면을 통째로 보고 싶어 한다. 세워 둔 상태에서는 낮은 상자가 높은 상자 뒤에 가려질 수 있으므로, 관리자는 상자를 모두 눕히려고 한다.

창고 바닥은 한 변이 1미터인 칸으로 이루어진 n×nn \times n 격자다. 상자를 눕히는 것은 밑면의 한 모서리를 축으로 상자를 굴리는 것과 같다. 높이가 zz인 상자를 한 방향으로 눕히면 원래 있던 칸이 비고 그 방향으로 이어지는 zz칸을 차지한다. 예를 들어 어떤 행이 ..3.....이면 그 상자를 오른쪽으로 눕힌 뒤에는 ...111...이 된다.

상자는 원하는 순서로 하나씩 눕힐 수 있고, 방향도 상자마다 따로 고를 수 있다. 다만 눕는 순간 차지하게 될 zz칸이 모두 창고 안에 있어야 하고, 그 칸에는 아직 서 있는 상자도 이미 누운 상자도 없어야 한다. 한 번 누운 상자는 그 자리에 그대로 남는다.

상자를 모두 눕힐 수 있는지 판별하시오.

입력

입력은 시나리오 여러 개로 이루어진다. 각 시나리오의 첫 줄에는 창고 한 변의 길이 nn이 주어진다. (3≤n≤303 \le n \le 30)

다음 줄부터는 한 줄에 정수 세 개 rr, cc, zz가 주어지며 각각 상자가 놓인 행, 열, 높이를 뜻한다. (1≤r,c≤n1 \le r, c \le n, 1<z<301 < z < 30) 시나리오마다 상자가 하나 이상 있고, 한 칸에 상자가 둘 이상 놓이지는 않는다. 상자 목록은 0 0 0인 줄로 끝난다.

전체 입력은 0 하나만 있는 줄로 끝난다.

출력

시나리오마다 한 줄씩 출력한다. 상자를 모두 눕힐 수 있으면 Possible을, 그렇지 않으면 Impossible을 출력한다.

예제2

  1. 예제 1

    입력
    4
    1 1 3
    1 4 3
    4 1 3
    4 4 3
    0 0 0
    4
    1 1 3
    1 4 3
    4 1 2
    4 4 3
    0 0 0
    0
    
    예상 출력
    Impossible
    Possible
    
  2. 예제 2

    입력
    3
    1 1 2
    0 0 0
    0
    
    예상 출력
    Possible