만드는 중입니다

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

동적 격자 (라지)

면접 대비

시간 제한5초메모리 제한512 MB

요약
이진 격자 셀을 갱신하면서 조회마다 상하좌우로 이어진 1 묶음 개수를 구합니다.
난이도

보통10점 중 4점

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

문제

0 또는 1이 적힌 RR행 CC열 격자가 있다. 이 격자에 연산을 NN번 수행한다. 연산은 다음 두 종류 중 하나다.

  • 연산 M: 격자의 한 칸의 값을 0 또는 1로 바꾼다.
  • 연산 Q: 1로 이루어진 연결 영역의 개수를 구한다. 1의 연결 영역은 값이 모두 1인 칸의 집합이고, 그 집합 안의 어떤 칸에서 출발해도 변을 맞댄 칸을 따라 이동해서 집합의 나머지 칸에 모두 도달한다. 꼭짓점만 맞닿은 두 칸은 이어진 것으로 보지 않는다.

입력

첫 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스의 첫 줄에는 격자의 행 수 RR과 열 수 CC가 주어진다. 이어지는 RR개의 줄에는 각각 0과 1로만 이루어진 길이 CC의 문자열이 주어지고, 이는 격자의 초기 상태다. 행 번호는 00부터 R−1R-1까지, 열 번호는 00부터 C−1C-1까지다.

그다음 줄에는 수행할 연산의 개수 NN이 주어진다. 이어지는 NN개의 줄에 연산이 한 줄에 하나씩 주어진다. 연산 M은 M x y z 꼴이고, xx행 yy열 칸의 값을 zz로 바꾼다는 뜻이다. 연산 Q는 Q 한 글자다.

출력

각 테스트 케이스마다 먼저 Case #x:를 한 줄에 출력한다. 여기서 xx는 1부터 시작하는 테스트 케이스 번호다. 그 뒤에 그 테스트 케이스의 연산 Q마다 입력에 주어진 순서대로 1의 연결 영역 개수를 한 줄에 하나씩 출력한다.

제한

  • 1≤T≤101 \le T \le 10
  • 1≤R,C≤1001 \le R, C \le 100
  • 0≤x<R0 \le x < R
  • 0≤y<C0 \le y < C
  • 0≤z≤10 \le z \le 1
  • 1≤N≤10001 \le N \le 1000

예제2

  1. 예제 1

    입력
    1
    4 4
    0101
    0010
    0100
    1111
    7
    Q
    M 0 2 1
    Q
    M 2 2 0
    Q
    M 2 1 0
    Q
    
    예상 출력
    Case #1:
    4
    2
    2
    2
    
  2. 예제 2

    입력
    3
    1 1
    1
    1
    Q
    2 3
    000
    000
    3
    Q
    M 1 1 1
    Q
    3 3
    101
    000
    101
    2
    Q
    M 1 1 1
    
    예상 출력
    Case #1:
    1
    Case #2:
    0
    1
    Case #3:
    4