물주기 계획 검증 3
시간 제한1초메모리 제한128 MB
격자 형태의 땅과 문자, 밑줄로 그린 살수 계획이 주어질 때, 계획이 규칙을 만족하는지 확인하고 울타리에 뚫린 구멍 수를 센다.
문제
사라는 커다란 직사각형 땅에서 농사를 짓는다. 땅은 개의 행과 개의 열로 이루어진 격자다. 다섯 행마다 가로 울타리가, 다섯 열마다 세로 울타리가 놓여 있어서 땅은 크기의 구역 개로 나뉜다.
새가 작물을 쪼아 먹는 것을 막으려고 몇몇 구역에는 허수아비가 서 있다. 허수아비는 칸 하나를 차지하고, 한 구역에 많아야 하나 있다.
가뭄에는 스프링클러로 물을 준다. 스프링클러 하나에는 노즐이 셋 있다. 가운데 노즐 하나와 옆 노즐 둘이고, 옆 노즐은 가운데 노즐과 상하좌우로 인접한 칸에 하나씩 놓인다. 그래서 스프링클러 하나는 정확히 세 칸을 차지하고 그 세 칸에 물을 준다. 세 칸은 일직선이거나 ㄱ자 모양이다.
물주기 계획은 허수아비가 없는 모든 칸에 스프링클러가 정확히 하나씩 물을 주도록 스프링클러를 놓은 것이다. 허수아비가 있는 칸에는 노즐을 놓지 않고, 노즐은 땅 밖으로 나가지 않는다.
스프링클러 하나가 물을 주는 세 칸이 같은 구역에 있어야 하는 것은 아니다. 세 칸이 이웃한 구역에 걸치면 사라는 그 두 칸 사이의 울타리에 구멍을 뚫는다.
계획은 땅과 같은 모양의 문자 그림으로 적는다. 빈 칸 자리에는 소문자를 적고, 같은 스프링클러가 물을 주는 두 칸 사이의 울타리 문자는 밑줄 _로 바꾼다. 글자는 다음 규칙을 따른다.
- 스프링클러 하나가 물을 주는 세 칸은 서로 다른 구역에 있더라도 같은 글자로 적는다.
- 같은 구역에서 인접한 두 칸을 서로 다른 스프링클러가 담당하면 두 칸은 다른 글자로 적는다.
- 이웃한 구역에서 인접한 두 칸을 서로 다른 스프링클러가 담당하고 그 사이에 구멍이 뚫려 있으면 두 칸은 다른 글자로 적는다.
- 앞의 규칙을 지키는 한, 서로 다른 구역에 있는 인접한 두 칸을 같은 글자로 적어도 된다.
이 규칙 덕분에 계획만 보고 스프링클러를 되살릴 수 있다. 인접한 두 칸은 글자가 같으면서 같은 구역에 있거나, 글자가 같으면서 사이에 구멍이 뚫려 있을 때 같은 스프링클러가 담당한다. 이렇게 이어지는 칸을 모두 모은 덩어리 하나가 스프링클러 하나다.
땅과 계획이 주어진다. 계획이 올바른지 판정하고, 올바르면 울타리에 뚫은 구멍의 개수를 세어라. 계획은 다음 세 조건을 모두 만족할 때 올바르다.
- 허수아비 자리에는
#가, 빈 칸 자리에는 소문자 하나가 적혀 있다. 울타리 자리에는 원래 울타리 문자나 밑줄이 있고, 울타리가 만나는+자리는 그대로+다. - 위 방법으로 되살린 덩어리가 모두 정확히 세 칸이다.
- 밑줄을 사이에 둔 두 칸에는 같은 소문자가 적혀 있다.
입력
첫째 줄에 과 가 주어진다. ()
다음 개 줄에는 각각 문자 개로 땅이 주어진다. 칸 하나는 문자 하나로 나타낸다. .은 빈 칸, #(아스키 35)은 허수아비다. 세로 울타리는 |(아스키 124), 가로 울타리는 -(빼기 기호)로 나타내고, 울타리가 만나는 자리는 +로 나타낸다. 울타리는 두께가 없지만 문자로 그린다.
이어서 개 줄에 같은 모양으로 계획이 주어진다. 계획의 각 줄은 영문자와 #, |, -, +, _로 이루어진다. 올바른 계획이라는 보장은 없다.
출력
계획이 올바르면 울타리에 뚫은 구멍의 개수를 출력한다. 올바르지 않으면 -1을 출력한다.