칠하기 서브태스크 2초 1024MB
문제
N × M 칸으로 이루어진 격자가 있다. 격자의 일부 칸들은 막혀서 갈 수 없는 칸들이고, 다른 칸들은 갈 수 있는 칸들이다.
이제 다음 규칙을 따라서 갈 수 있는 칸들에 색을 칠하려고 한다.
N ×M 칸 중 한 칸을 현재 칸으로 잡고 시작한다. 시작하는 현재 칸은 갈 수 있는 칸 중 어떤 것이든 가능하다.
현재 칸에서 한 방향(위/아래/왼쪽/오른쪽 중 하나)을 정하고, 격자의 왼쪽/오른쪽/위/아래 경계에 도착하거나 이동하려는 칸이 막혀 있을 때까지 계속 이동한다. 중간에 멈출 수 없음에 유의하시오.
정지할 때까지 만약 가로 방향(왼쪽 또는 오른쪽)으로 이동했다면 가로로 이동했던 칸들이 모두 노란 색으로 칠해진다. 이동을 시작한 칸도 노란 색으로 칠해진다. 만약 정지할 때까지 세로 방향(위 또는 아래)으로 이동했다면 세로로 이동했던 칸들이 모두 파란 색으로 칠해진다. 이동을 시작한 칸도 파란 색으로 칠해진다. (이동하려는 방향이 바로 막혀 있어서 한 칸도 이동할 수 없었던 경우에도 시작하는 칸에 색이 칠해지는 것으로 정한다.)
모든 갈 수 있는 칸을 적어도 한 번 이상 노란 색으로 칠했고, 또 적어도 한 번 이상 파란색으로 칠했다면 성공이며 종료한다.
만약 그렇지 않다면, 2번 과정이 끝났을 때 정지한 칸, 즉 마지막으로 이동할 수 있었던 칸으로부터 시작하여 다시 2-4번 과정을 반복한다. 이 과정을 무한히 반복하더라도 모든 갈 수 있는 칸을 적어도 한 번 이상 노란색으로, 또 적어도 한 번 이상 파란 색으로 칠할 방법이 없다면 실패이다.
예를 들어 다음 예를 살펴보자. N × M 격자의 모든 칸이 갈 수 있는 칸들인 다음 예제에서,
가장 왼쪽 위인 (0, 0)에서 출발하면 왼쪽 그림과 가운데 그림의 예와 같이,
어떻게 이동하더라도 모든 갈 수 있는 칸을 적어도 한 번 파란색, 그리고 적어도 한 번 노란색으로 칠할 수 없다.
반면, (0, 1)에서 출발하여 오른쪽 그림처럼 이동하면 모든 갈 수 있는 칸을 적어도 한 번 파란색, 그리고 적어도 한 번 노란색으로 칠할 수 있음을 알 수 있다.
격자의 크기와 배치가 주어졌을 때, 모든 갈 수 있는 칸을 파란색과 노란색으로 칠할 수 있는지를 구하려 한다.
입력
첫 줄에 N M이 주어진다.
이후 N줄에 걸쳐 길이 M의 문자열이 하나씩 들어오고 이는 격자 판의 배치를 의미한다.
'.' 문자는 격자의 해당 위치가 빈칸임을, '#'문자는 해당 위치가 갈 수 없는 칸임을 의미한다.
1 <= N <= 1 000
1 <= M <= 1 000
각 서브태스크의 모든 케이스를 통과해야 점수를 획득할 수 있다.
출력
만약 조건을 만족시키는 방법이 존재한다면 1을, 존재하지 않는다면 0을 출력한다.
부분문제
| 번호 | 점수 | 조건 |
|---|---|---|
| #1 | 30점 | N, M <= 50 |
| #2 | 70점 | 추가 제한조건 없음 |
예제 #1
1 1
.
1
예제 #2
2 3
...
...
1
예제 #3
3 3
...
..#
.##
1
예제 #4
3 3
.##
#..
#..
0