Crosswords
농부 존은 신문을 볼 때마다 십자말풀이(Crossword) 퀴즈를 푸는 것을 매우 즐깁니다.
이번 십자말풀이판은 \(N\)행 \(M\)열의 격자로 이루어져 있으며, 각 칸은 빈칸('.') 또는 검은색 칸('#')입니다. (\(3 \le N, M \le 50\))
단어는 가로(왼쪽에서 오른쪽) 또는 세로(위에서 아래) 방향으로 연속된 3개 이상의 빈칸으로 이루어집니다.
존은 단어가 시작될 수 있는 칸마다 번호를 붙이려고 합니다. 어떤 칸 \((r, c)\)가 단어의 시작 칸이 되기 위해서는 다음 조건들을 만족해야 합니다.
- 해당 칸이 빈칸('.')이어야 합니다.
- 다음 두 조건 중 적어도 하나를 만족해야 합니다.
- 가로 단어의 시작: 해당 칸이 격자의 왼쪽 끝이거나 바로 왼쪽 칸이 검은색 칸('#')이고, 오른쪽으로 연속한 최소 2개의 칸 \((r, c+1)\)과 \((r, c+2)\)가 모두 빈칸('.')이어야 합니다.
- 세로 단어의 시작: 해당 칸이 격자의 상단 끝이거나 바로 위 칸이 검은색 칸('#')이고, 아래쪽으로 연속한 최소 2개의 칸 \((r+1, c)\)과 \((r+2, c)\)가 모두 빈칸('.')이어야 합니다.
하나의 칸이 가로 단어와 세로 단어의 시작 칸 역할을 동시에 할 수도 있습니다. 십자말풀이판에서 단어의 시작 칸이 되는 모든 위치를 구하는 프로그램을 작성하세요.
입력
첫째 줄에 격자의 행 개수 \(N\)과 열 개수 \(M\)이 공백으로 구분되어 주어진다. (\(3 \le N, M \le 50\))
둘째 줄부터 \(N\)개의 줄에 걸쳐 각 줄마다 \(M\)개의 문자로 격자 상태가 주어진다. 각 문자는 빈칸을 나타내는 '.' 또는 검은색 칸을 나타내는 '#' 중 하나이다.
출력
첫째 줄에 단어의 시작 칸의 개수 \(K\)를 출력한다.
둘째 줄부터 \(K\)개의 줄에 걸쳐 단어의 시작 칸의 행 번호와 열 번호를 위에서 아래로, 왼쪽에서 오른쪽 순서대로 한 줄에 하나씩 공백으로 구분하여 출력한다. (행과 열 번호는 \(1\)부터 시작한다.)
예제 입력 1
5 3
...
#.#
...
...
...
예제 출력 1
3
1 1
3 1
3 3
출처
USACO 2014 December Contest, Bronze
코멘트