물주기 배치 검사

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

요약
각 sprinkler가 정확히 세 칸을 담당하고 같은 문자를 쓰는지 규칙에 따라 확인한 뒤, 계획이 타당하면 구멍의 개수를 출력하고 아니면 -1을 출력한다.
난이도

보통10점 중 7점

유형
구현, 시뮬레이션, 그래프, 유니온 파인드
정답자
아직 제출이 없습니다

문제

사라는 커다란 직사각형 땅에서 농사를 짓는다. 땅은 5R5R개의 행과 5C5C개의 열로 이루어진 칸의 격자이다. 다섯 행마다 가로 울타리가 땅의 너비 전체를 가로지르고, 다섯 열마다 세로 울타리가 땅의 높이 전체를 가로지른다. 울타리는 땅을 5×55 \times 5 칸짜리 구역 R×CR \times C개로 나누는데, 이 구역을 밭이라고 부른다.

사라를 괴롭히는 것은 새와 가뭄이다. 새를 쫓으려고 허수아비를 세운다. 허수아비는 한 칸을 차지하고, 한 밭에 허수아비는 많아야 하나 있다.

가뭄에는 스프링클러로 작물에 물을 준다. 스프링클러에는 중앙 노즐 하나와 옆 노즐 둘이 달려 있어서 정확히 세 칸을 차지하고 그 세 칸에 물을 준다. 옆 노즐 둘은 중앙 노즐이 놓인 칸과 상하좌우로 인접한 두 칸에 놓인다.

물주기 배치는 허수아비가 없는 모든 칸에 스프링클러 노즐을 정확히 하나씩 놓는다. 허수아비가 있는 칸에는 노즐을 놓지 않고, 땅 밖으로 나가는 노즐도 없다.

한 스프링클러의 세 칸이 같은 밭에 있어야 하는 것은 아니다. 그중 두 칸이 이웃한 밭에 나뉘어 놓이면 사라는 그 두 칸 사이의 울타리에 구멍을 뚫는다.

사라는 땅과 같은 모양의 격자에 배치를 적었다. 허수아비 칸은 # 그대로 두고, 나머지 칸에는 a부터 z까지의 소문자를 적고, 구멍은 울타리 자리에 _로 표시한다. 글자는 다음 네 규칙을 지킨다.

  1. 한 스프링클러가 물을 주는 세 칸은 모두 같은 밭에 있지 않더라도 같은 글자로 적는다.
  2. 같은 밭에서 인접한 두 칸에 서로 다른 스프링클러가 물을 주면 두 칸을 다른 글자로 적는다.
  3. 이웃한 두 밭에서 인접한 두 칸에 서로 다른 스프링클러가 물을 주고 그 사이 울타리에 구멍이 뚫려 있으면 두 칸을 다른 글자로 적는다.
  4. 이웃한 두 밭에서 인접한 두 칸 사이에 구멍이 없으면 두 칸을 같은 글자로 적어도 된다.

이 규칙 덕분에 배치를 읽는 방법은 하나뿐이다. 인접한 두 칸은 글자가 같으면서 같은 밭에 있거나 그 사이 울타리에 구멍이 뚫려 있을 때, 그리고 그때만 같은 스프링클러에 속한다. 이 관계로 칸을 묶으면 스프링클러가 하나씩 나온다.

배치가 올바르려면 배치의 허수아비 자리가 땅의 허수아비 자리와 정확히 같고, 묶인 무리가 모두 정확히 세 칸이어야 한다.

입력

첫째 줄에 정수 RR과 CC가 주어진다.

다음 6R−16R-1개 줄에는 각각 6C−16C-1개의 문자가 있고, 땅을 나타낸다. 빈 칸은 ., 허수아비가 있는 칸은 #(ASCII 35)이다. 세로 울타리는 |(ASCII 124), 가로 울타리는 -, 두 울타리가 만나는 자리는 +이다. 울타리는 실제로 두께가 없지만 문자로 그린다.

다음 6R−16R-1개 줄에는 각각 6C−16C-1개의 문자가 있고, 같은 형식으로 사라의 배치를 나타낸다. 칸 자리에는 # 또는 소문자가 온다. 세로 울타리 자리에는 | 또는 _, 가로 울타리 자리에는 - 또는 _가 오고, 울타리가 만나는 자리에는 모두 +가 온다. _ 하나가 구멍 하나이다.

출력

정수 하나를 출력한다. 사라의 배치가 올바르면 뚫어야 하는 구멍의 개수, 즉 _의 개수를 출력한다. 올바르지 않으면 -1을 출력한다.

사라는 어떤 스프링클러도 지나지 않는 구멍을 뚫을 수 있고, 그런 구멍도 개수에 넣는다.

제한

  • 1≤R,C≤1001 \le R, C \le 100
  • 한 밭에 허수아비는 많아야 하나 있다
  • 두 격자 모두 정확히 6R−16R-1개 줄이고 각 줄은 6C−16C-1개 문자이며, 울타리 문자는 울타리 자리에만 나온다

예제3

  1. 예제 1

    입력
    2 2
    .....|.....
    .....|.....
    ...#.|.....
    .....|.....
    .....|.....
    -----+-----
    .....|.....
    .....|.....
    .....|.....
    .....|.....
    .....|.....
    aaacc|dxxxa
    bbbce|dyyya
    ddd#e|dzzza
    ccbae|fccbb
    cbbaa|ffcdb
    -----+---_-
    ssrrr|tttdd
    saaax_xxeee
    yxbbb|zdaaa
    yxccc|zdbbb
    yxddd|zdccc
    
    예상 출력
    2
    
  2. 예제 2

    입력
    1 1
    .....
    .....
    .....
    .....
    ....#
    ababa
    ababa
    ababa
    ccdee
    cdde#
    
    예상 출력
    0
    
  3. 예제 3

    입력
    2 2
    .....|.....
    .....|.....
    .....|.....
    .....|.....
    .....|.....
    -----+-----
    .....|.....
    .....|.....
    .....|.....
    .....|.....
    .....|....#
    ababa|ababa
    ababa|ababa
    ababa|ababa
    ccdee|eedcc
    cddez_zeddc
    ----_+-----
    cddez|ababa
    ccdee|ababa
    ababa|ababa
    ababa|ccdee
    ababa|cdde#
    
    예상 출력
    2