카드 접기

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

요약
카드 격자를 위, 아래, 왼쪽, 오른쪽으로 접어 하나의 더미로 만든 뒤, 뒤집힘 상태를 반영해 마지막 더미에서 앞면인 카드를 아래부터 나열한다.
난이도

보통10점 중 6점

유형
시뮬레이션, 구현, 행렬, 재귀
정답자
아직 제출이 없습니다

문제

n×mn \times m 격자 위에 카드가 놓여 있다. 각 카드에는 번호가 적혀 있고, 일부는 앞면이, 일부는 뒷면이 위를 향한다. 다음 네 종류의 뒤집기를 반복하면 격자를 하나의 카드 더미로 접을 수 있다.

  • 위쪽 뒤집기(Top): 맨 윗줄의 카드들을 바로 아랫줄의 같은 위치 카드 위로 뒤집어 넘긴다. 앞면이던 카드는 뒤집힌 뒤 뒷면이 되고, 그 반대도 마찬가지다. 어떤 칸에 카드 더미가 쌓여 있으면, 그 더미 전체가 팬케이크 더미처럼 통째로 뒤집히면서(쌓인 순서가 뒤집힌다) 아래 더미 위로 옮겨진다.
  • 아래쪽 뒤집기(Bottom): 위쪽 뒤집기와 같지만, 맨 아랫줄을 바로 윗줄 위로 뒤집어 넘긴다.
  • 왼쪽 뒤집기(Left): 맨 왼쪽 열의 카드들을 바로 오른쪽 열 위로 뒤집어 넘긴다.
  • 오른쪽 뒤집기(Right): 맨 오른쪽 열의 카드들을 바로 왼쪽 열 위로 뒤집어 넘긴다.

n+m−2n + m - 2번의 뒤집기를 하고 나면 모든 카드가 하나의 더미가 되며, 일부는 앞면이 일부는 뒷면이 위를 향한다. 이 최종 더미에서 앞면이 위를 향한 카드들의 순서를 구하라.

입력

각 테스트 케이스의 첫 줄에는 격자의 행 수와 열 수를 나타내는 두 양의 정수 nn과 mm이 주어진다. 이어지는 nn개의 줄에는 각각 mm개의 정수가 주어져 각 카드의 번호와 방향을 나타낸다. (첫 줄이 맨 윗줄이고, 각 줄의 첫 값이 맨 왼쪽 카드이다.) 양의 정수 kk는 그 자리에 카드 kk가 앞면으로 놓여 있음을, 음의 정수 −k-k는 카드 kk가 뒷면으로 놓여 있음을 뜻한다. (kk는 절대 0이 아니다.)

이 nn개의 줄 다음에는 적용할 뒤집기를 나타내는 n+m−2n + m - 2개의 문자로 이루어진 한 줄이 온다. 각 문자는 위쪽·아래쪽·왼쪽·오른쪽 뒤집기를 뜻하는 T, B, L, R 중 하나이다. 모든 뒤집기 순서는 항상 유효하다. 즉 위쪽과 아래쪽 뒤집기를 합쳐 n−1n - 1번보다 많이, 또는 왼쪽과 오른쪽 뒤집기를 합쳐 m−1m - 1번보다 많이 요구하지 않는다. nn과 mm의 최댓값은 2020이다.

입력은 두 개의 0이 적힌 줄로 끝난다.

출력

각 테스트 케이스마다, 케이스 번호에 이어 최종 더미에서 앞면이 위를 향한 모든 카드의 번호를 더미의 맨 아래부터 순서대로 아래 형식으로 출력한다.

Case X: c1 c2 ...

앞면인 카드가 하나도 없으면 케이스 표시만 출력한다. (예: Case 2:)

예제1

  1. 예제 1

    입력
    2 3
    4 -17 -8
    6 23 -5
    LRB
    1 1
    -3
    
    1 1
    3
    
    0 0
    
    예상 출력
    Case 1: 8 6
    Case 2:
    Case 3: 3