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

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

알파리즈 표 붕괴

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

요약
문자 격자와 선택한 칸 목록이 주어질 때, 각 칸이 속한 4방향 연결 같은 문자 영역을 지우고 행은 왼쪽으로 열은 아래로 밀어 빈 행과 열을 삭제하는 과정을 반복한다.
난이도

보통10점 중 6점

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

문제

소문자로 채워진 표가 주어진다(예: 표 I). 게임은 여러 단계로 진행된다. 각 단계에서 빈칸이 아닌 문자 ch 를 담고 있는 칸 EE 를 하나 고른다. EE 에서 출발하여 그 칸의 친구를 모두 찾는다. 친구란 EE 와 상하좌우로 바로 맞닿아 있으면서 같은 문자 ch 를 담고 있는 칸, 그리고 그 칸들의 친구, 이런 식으로 더 이상 새로운 친구를 찾을 수 없을 때까지 이어지는 칸들을 말한다. 즉 EE 의 친구들은 상하좌우 인접을 기준으로 EE 를 포함하는 같은 문자로 이루어진 연결 영역이다. 그런 다음 EE 와 모든 친구의 ch 를 빈칸으로 바꾼다. 표 II 는 표 I 에 대해 1행 2열의 칸에서 시작해(이때 ch 는 a) 이 규칙을 적용한 결과이다.

같은 단계 안에서 계속하여, 먼저 빈칸이 아닌 문자들을 모두 왼쪽으로 최대한 밀어 각 행의 빈칸이 오른쪽으로 모이게 한다(표 III). 이어서 빈칸이 아닌 문자들을 모두 아래로 최대한 밀어 각 열의 빈칸이 위로 모이게 한다(표 IV). 마지막으로, 완전히 빈칸이 된 행이나 열은 삭제하여 표를 줄인다.

처음 표와 선택된 칸들의 순서가 주어졌을 때, 위 규칙을 각 선택 칸에 차례대로 적용하고 최종 표를 출력하는 프로그램을 작성하라.

입력

입력은 여러 개의 테스트 케이스로 이루어지며, 입력이 끝날 때까지 연달아 주어진다.

각 테스트 케이스는 문자 표로 시작한다. 문자 표는 각 줄이 nn 개의 문자로 이루어진 mm 개의 줄로 주어지며(1≤m,n≤10001 \le m, n \le 1000), 처음 표의 모든 문자는 소문자이다. 표의 각 줄은 문자로만 이루어지므로, 정수로 된 첫 번째 줄에서 표가 끝난다. 그 줄은 선택할 칸의 개수 kk 를 담고 있다. 이어서 kk 개의 줄이 주어지며, 각 줄에는 선택 칸의 행과 열을 나타내는 두 정수 rr 과 cc (1≤r≤m1 \le r \le m, 1≤c≤n1 \le c \le n)가 있다. 좌표는 (이전 단계의 삭제가 반영된) 현재 표를 기준으로 하며, 각 선택 칸은 항상 현재 표 안에 있다.

출력

ii 번째 테스트 케이스에 대해 먼저 다음 줄을 출력한다.

Test case #ii:

그다음 최종 표를 입력과 같은 문자 형식으로 한 줄에 한 행씩 출력한다. 각 행의 뒤쪽 빈칸은 생략하므로 행마다 길이가 다를 수 있다. 표가 완전히 비었다면 이 머리글 줄 뒤에 아무 행도 출력하지 않는다.

예제1

  1. 예제 1

    입력
    aabbb
    abaab
    aaaba
    abbaa
    1
    1 2
    aba
    bbc
    2
    1 3
    2 2
    
    예상 출력
    Test case #1:
    bb
    bb
    bab
    bbaa
    Test case #2:
    a
    c