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

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

물주기 계획 검증 3

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

요약
격자 형태의 땅과 문자, 밑줄로 그린 살수 계획이 주어질 때, 계획이 규칙을 만족하는지 확인하고 울타리에 뚫린 구멍 수를 센다.
난이도

보통10점 중 6점

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

문제

사라는 커다란 직사각형 땅에서 농사를 짓는다. 땅은 5R5R개의 행과 5C5C개의 열로 이루어진 격자다. 다섯 행마다 가로 울타리가, 다섯 열마다 세로 울타리가 놓여 있어서 땅은 5×55 \times 5 크기의 구역 R×CR \times C개로 나뉜다.

새가 작물을 쪼아 먹는 것을 막으려고 몇몇 구역에는 허수아비가 서 있다. 허수아비는 칸 하나를 차지하고, 한 구역에 많아야 하나 있다.

가뭄에는 스프링클러로 물을 준다. 스프링클러 하나에는 노즐이 셋 있다. 가운데 노즐 하나와 옆 노즐 둘이고, 옆 노즐은 가운데 노즐과 상하좌우로 인접한 칸에 하나씩 놓인다. 그래서 스프링클러 하나는 정확히 세 칸을 차지하고 그 세 칸에 물을 준다. 세 칸은 일직선이거나 ㄱ자 모양이다.

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

스프링클러 하나가 물을 주는 세 칸이 같은 구역에 있어야 하는 것은 아니다. 세 칸이 이웃한 구역에 걸치면 사라는 그 두 칸 사이의 울타리에 구멍을 뚫는다.

계획은 땅과 같은 모양의 문자 그림으로 적는다. 빈 칸 자리에는 소문자를 적고, 같은 스프링클러가 물을 주는 두 칸 사이의 울타리 문자는 밑줄 _로 바꾼다. 글자는 다음 규칙을 따른다.

  1. 스프링클러 하나가 물을 주는 세 칸은 서로 다른 구역에 있더라도 같은 글자로 적는다.
  2. 같은 구역에서 인접한 두 칸을 서로 다른 스프링클러가 담당하면 두 칸은 다른 글자로 적는다.
  3. 이웃한 구역에서 인접한 두 칸을 서로 다른 스프링클러가 담당하고 그 사이에 구멍이 뚫려 있으면 두 칸은 다른 글자로 적는다.
  4. 앞의 규칙을 지키는 한, 서로 다른 구역에 있는 인접한 두 칸을 같은 글자로 적어도 된다.

이 규칙 덕분에 계획만 보고 스프링클러를 되살릴 수 있다. 인접한 두 칸은 글자가 같으면서 같은 구역에 있거나, 글자가 같으면서 사이에 구멍이 뚫려 있을 때 같은 스프링클러가 담당한다. 이렇게 이어지는 칸을 모두 모은 덩어리 하나가 스프링클러 하나다.

땅과 계획이 주어진다. 계획이 올바른지 판정하고, 올바르면 울타리에 뚫은 구멍의 개수를 세어라. 계획은 다음 세 조건을 모두 만족할 때 올바르다.

  1. 허수아비 자리에는 #가, 빈 칸 자리에는 소문자 하나가 적혀 있다. 울타리 자리에는 원래 울타리 문자나 밑줄이 있고, 울타리가 만나는 + 자리는 그대로 +다.
  2. 위 방법으로 되살린 덩어리가 모두 정확히 세 칸이다.
  3. 밑줄을 사이에 둔 두 칸에는 같은 소문자가 적혀 있다.

입력

첫째 줄에 RR과 CC가 주어진다. (1≤R,C≤1001 \le R, C \le 100)

다음 6R−16R-1개 줄에는 각각 문자 6C−16C-1개로 땅이 주어진다. 칸 하나는 문자 하나로 나타낸다. .은 빈 칸, #(아스키 35)은 허수아비다. 세로 울타리는 |(아스키 124), 가로 울타리는 -(빼기 기호)로 나타내고, 울타리가 만나는 자리는 +로 나타낸다. 울타리는 두께가 없지만 문자로 그린다.

이어서 6R−16R-1개 줄에 같은 모양으로 계획이 주어진다. 계획의 각 줄은 영문자와 #, |, -, +, _로 이루어진다. 올바른 계획이라는 보장은 없다.

출력

계획이 올바르면 울타리에 뚫은 구멍의 개수를 출력한다. 올바르지 않으면 -1을 출력한다.

예제4

  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
    .....
    .....
    ..#..
    .....
    .....
    aaabb
    cccba
    aa#aa
    abbbc
    dddcc
    
    예상 출력
    0
    
  3. 예제 3

    입력
    1 3
    .....|.....|.....
    .....|.....|.....
    .....|.....|.....
    .....|.....|.....
    .....|.....|.....
    aaabb_baaab_bbaaa
    bbbaa_abbba_aabbb
    aaabb_baaab_bbaaa
    bbbaa_abbba_aabbb
    aaabb_baaab_bbaaa
    
    예상 출력
    10
    
  4. 예제 4

    입력
    1 3
    .....|.....|.....
    .....|.....|.....
    .....|.....|.....
    .....|.....|.....
    .....|.....|.....
    aaabb|baaab_bbaaa
    bbbaa_abbba_aabbb
    aaabb_baaab_bbaaa
    bbbaa_abbba_aabbb
    aaabb_baaab_bbaaa
    
    예상 출력
    -1