물주기 배치 검사
시간 제한1초메모리 제한128 MB
각 sprinkler가 정확히 세 칸을 담당하고 같은 문자를 쓰는지 규칙에 따라 확인한 뒤, 계획이 타당하면 구멍의 개수를 출력하고 아니면 -1을 출력한다.
문제
사라는 커다란 직사각형 땅에서 농사를 짓는다. 땅은 개의 행과 개의 열로 이루어진 칸의 격자이다. 다섯 행마다 가로 울타리가 땅의 너비 전체를 가로지르고, 다섯 열마다 세로 울타리가 땅의 높이 전체를 가로지른다. 울타리는 땅을 칸짜리 구역 개로 나누는데, 이 구역을 밭이라고 부른다.
사라를 괴롭히는 것은 새와 가뭄이다. 새를 쫓으려고 허수아비를 세운다. 허수아비는 한 칸을 차지하고, 한 밭에 허수아비는 많아야 하나 있다.
가뭄에는 스프링클러로 작물에 물을 준다. 스프링클러에는 중앙 노즐 하나와 옆 노즐 둘이 달려 있어서 정확히 세 칸을 차지하고 그 세 칸에 물을 준다. 옆 노즐 둘은 중앙 노즐이 놓인 칸과 상하좌우로 인접한 두 칸에 놓인다.
물주기 배치는 허수아비가 없는 모든 칸에 스프링클러 노즐을 정확히 하나씩 놓는다. 허수아비가 있는 칸에는 노즐을 놓지 않고, 땅 밖으로 나가는 노즐도 없다.
한 스프링클러의 세 칸이 같은 밭에 있어야 하는 것은 아니다. 그중 두 칸이 이웃한 밭에 나뉘어 놓이면 사라는 그 두 칸 사이의 울타리에 구멍을 뚫는다.
사라는 땅과 같은 모양의 격자에 배치를 적었다. 허수아비 칸은 # 그대로 두고, 나머지 칸에는 a부터 z까지의 소문자를 적고, 구멍은 울타리 자리에 _로 표시한다. 글자는 다음 네 규칙을 지킨다.
- 한 스프링클러가 물을 주는 세 칸은 모두 같은 밭에 있지 않더라도 같은 글자로 적는다.
- 같은 밭에서 인접한 두 칸에 서로 다른 스프링클러가 물을 주면 두 칸을 다른 글자로 적는다.
- 이웃한 두 밭에서 인접한 두 칸에 서로 다른 스프링클러가 물을 주고 그 사이 울타리에 구멍이 뚫려 있으면 두 칸을 다른 글자로 적는다.
- 이웃한 두 밭에서 인접한 두 칸 사이에 구멍이 없으면 두 칸을 같은 글자로 적어도 된다.
이 규칙 덕분에 배치를 읽는 방법은 하나뿐이다. 인접한 두 칸은 글자가 같으면서 같은 밭에 있거나 그 사이 울타리에 구멍이 뚫려 있을 때, 그리고 그때만 같은 스프링클러에 속한다. 이 관계로 칸을 묶으면 스프링클러가 하나씩 나온다.
배치가 올바르려면 배치의 허수아비 자리가 땅의 허수아비 자리와 정확히 같고, 묶인 무리가 모두 정확히 세 칸이어야 한다.
입력
첫째 줄에 정수 과 가 주어진다.
다음 개 줄에는 각각 개의 문자가 있고, 땅을 나타낸다. 빈 칸은 ., 허수아비가 있는 칸은 #(ASCII 35)이다. 세로 울타리는 |(ASCII 124), 가로 울타리는 -, 두 울타리가 만나는 자리는 +이다. 울타리는 실제로 두께가 없지만 문자로 그린다.
다음 개 줄에는 각각 개의 문자가 있고, 같은 형식으로 사라의 배치를 나타낸다. 칸 자리에는 # 또는 소문자가 온다. 세로 울타리 자리에는 | 또는 _, 가로 울타리 자리에는 - 또는 _가 오고, 울타리가 만나는 자리에는 모두 +가 온다. _ 하나가 구멍 하나이다.
출력
정수 하나를 출력한다. 사라의 배치가 올바르면 뚫어야 하는 구멍의 개수, 즉 _의 개수를 출력한다. 올바르지 않으면 -1을 출력한다.
사라는 어떤 스프링클러도 지나지 않는 구멍을 뚫을 수 있고, 그런 구멍도 개수에 넣는다.
제한
- 한 밭에 허수아비는 많아야 하나 있다
- 두 격자 모두 정확히 개 줄이고 각 줄은 개 문자이며, 울타리 문자는 울타리 자리에만 나온다