만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

뒤섞인 스택

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

요약
용량이 정해진 스택 사이에서 맨 위 카드만 옮겨, 카드 1부터 n까지를 아래에서 위로 정렬하고 앞쪽 스택부터 채우는 이동 순서를 출력합니다.
난이도

보통10점 중 6점

유형
시뮬레이션, 스택, 구현
정답자
아직 제출이 없습니다

문제

nn장의 카드에는 1부터 nn까지 번호가 붙어 있고, 이 카드들은 kk개의 스택 S1,S2,…,SkS_1, S_2, \ldots, S_k에 나뉘어 놓여 있다. 각 스택에는 용량 제한이 있다. ii번째 스택 SiS_i에는 최대 CiC_i장까지 쌓을 수 있다. 카드를 다루는 방법은 스택의 맨 위 카드를 꺼내 다른 스택의 맨 위에 옮기는 것뿐이다. 이때 옮기는 스택의 용량을 넘을 수 없다.

이런 이동을 반복해서, 번호가 작은 쪽의 스택 몇 개(0개 이상)는 용량을 꽉 채우고, 그 다음 스택은 꽉 채우지 않으며(비어 있어도 된다), 그 뒤의 스택은 모두 비도록 카드를 재배치하려고 한다. 또한 S1S_1을 맨 아래, SkS_k를 맨 위로 두고 모든 스택을 이어 쌓았을 때, 카드는 아래에서 위로 1부터 nn까지 작은 순서로 정렬되어 있어야 한다.

n≤(∑i=1kCi)−max⁡1≤i≤kCin \le \left(\sum_{i=1}^k C_i\right) - \max_{1 \le i \le k} C_i임이 보장된다.

n=6n = 6, k=3k = 3인 경우를 보자. 용량은 C1=4C_1 = 4, C2=C3=3C_2 = C_3 = 3이고, 초기 상태는 S1=[2,3,0,0]S_1 = [2, 3, 0, 0](아래에서 위 순서, 00은 빈 칸), S2=[4,1,6]S_2 = [4, 1, 6], S3=[5,0,0]S_3 = [5, 0, 0]이다. 이때 원하는 최종 상태는 S1=[1,2,3,4]S_1 = [1, 2, 3, 4], S2=[5,6,0]S_2 = [5, 6, 0], S3=[0,0,0]S_3 = [0, 0, 0]이다.

입력

첫 줄에는 카드의 개수 nn과 스택의 개수 kk가 공백으로 구분되어 주어진다. 이어지는 kk개의 줄은 각 스택의 초기 상태를 나타낸다. ii번째 줄은 SiS_i에 대한 정보이며, 공백으로 구분된 Ci+1C_i + 1개의 정수를 담고 있다. 첫 번째 정수는 SiS_i의 용량 CiC_i이고, 나머지는 SiS_i에 있는 카드 번호를 아래에서 위 순서로 적은 것이다. SiS_i의 카드가 CiC_i장보다 적으면(비어 있을 수도 있다) 줄의 마지막 몇 개 정수는 0이다.

출력

스택을 원하는 최종 상태로 만드는 이동 순서를 출력한다. 각 이동마다 카드를 꺼내는 스택의 번호와 카드를 옮길 스택의 번호를 공백으로 구분하여 한 줄에 출력한다. 스택 번호는 1부터 kk까지이며, 옮길 스택은 꺼낼 스택과 달라야 한다. 이동 횟수는 10510^5를 넘을 수 없다. 이동을 모두 출력한 뒤에는 "0 0"(따옴표는 제외)이라는 줄을 출력한다. 가능한 해가 여러 개라면 그중 어느 것을 출력해도 된다.

제한

  • 1≤n≤1001 \le n \le 100
  • 3≤k≤1003 \le k \le 100
  • 1≤Ci≤n1 \le C_i \le n

힌트

이 문제는 앞의 문제 설명에서 든 예시이다. 샘플 출력은 스택을 원하는 최종 상태로 만드는 14번의 이동을 보여준다.

예제1

  1. 예제 1

    입력
    6 3
    4 2 3 0 0
    3 4 1 6
    3 5 0 0
    
    예상 출력
    2 3
    2 3
    1 2
    1 2
    3 1
    2 1
    2 1
    3 2
    3 1
    2 3
    1 3
    2 1
    3 2
    3 2
    0 0