Minegraphed
시간 제한2초메모리 제한512 MB
정점이 최대 9개인 방향 그래프가 주어질 때, 빈 칸과 장애물로 이루어진 3차원 격자를 만들어 번호 붙은 칸 사이의 이동 가능 여부가 그래프의 경로 여부와 같게 합니다.
문제
Marika는 "Minegraphed"라는 게임을 만들고 있다. 이 게임은 3차원 직육면체 세계를 돌아다니는 게임이다.
직육면체 게임 필드의 각 칸은 빈 칸이거나 장애물 칸이다. 당신은 항상 빈 칸에 서 있으며, 그 칸은 가장 아래 층에 있거나 장애물 칸 위에 있다. 한 번의 이동은 북, 동, 남, 서 네 방향 중 하나로 할 수 있다. 이동은 다음 규칙을 따른다.
- 직육면체 밖으로 이동하려고 하면 그 이동은 할 수 없다.
- 그렇지 않고 앞 칸이 빈 칸이면, 그 칸으로 한 칸 전진한 뒤 가장 아래 층이나 장애물 칸에 닿을 때까지 아래로 떨어진다.
- 그렇지 않고 맨 위 층이 아니며, 앞 칸이 장애물이고, 자신의 위 칸과 그 장애물의 위 칸이 모두 비어 있으면, 그 장애물 위로 올라간다.
- 그 밖의 경우에는 이동할 수 없다.
Marika는 정점이 개인 방향 그래프를 준비했다. 이제 그녀는 필드를 설계하고, 서로 다른 개의 서 있을 수 있는 위치에 1부터 까지 번호를 붙이려 한다. 번호 가 붙은 칸에서 번호 가 붙은 칸으로 유효한 이동을 통해 갈 수 있는 것은, 그래프에서 정점 에서 정점 로 간선을 따라 갈 수 있는 것과 같을 때이고 그때에만 해당한다. Marika가 이 성질을 만족하는 필드를 설계하도록 도와라.
입력
첫 줄에 정수 ()이 주어진다. 이어지는 개의 줄에는 각각 0 또는 1인 정수 개가 주어진다. 번째 줄의 번째 수는 정점 에서 정점 로 가는 간선이 있으면 1, 없으면 0이다. 번째 줄의 번째 수는 항상 0이다.
출력
주어진 그래프와 같은 도달 관계를 가진 필드를 층별 표현으로 출력하라.
첫 줄에는 설계할 직육면체의 동서 방향, 남북 방향, 위아래 방향 크기를 나타내는 양의 정수 , , 를 출력한다. 이어서 개 층을 가장 위 층부터 가장 아래 층까지 순서대로 출력하며, 블록 사이는 빈 줄 하나로 구분한다. 각 블록은 길이 인 줄 개로 이루어지며, 점('.'), 샵('#'), 1부터 까지의 숫자로 구성된다. '#'은 장애물 칸이고, '.'은 번호가 붙지 않은 빈 칸이며, 숫자는 번호가 붙은 빈 칸이다. 1부터 까지의 각 숫자는 정확히 한 번씩 나타나야 한다. 각 숫자는 가장 아래 층에 있거나 장애물 위에 있어야 한다. 장애물은 공중에 떠 있어도 된다(장애물에는 중력이 없다).
필드의 부피 는 을 넘으면 안 된다. 입력으로 주어지는 어떤 그래프에 대해서도 이 제한 안에 드는 올바른 필드가 존재함이 보장된다.
힌트
1번 칸에서 4번 칸으로는 올라갈 수 있다. 하지만 천장 장애물 때문에 2번 칸에서 1번 칸으로는 올라갈 수 없다.