/*
* Problem :: 2823 / 유턴 싫어
*
* Kind :: Graph
*
* Insight
* - 어떤 마을의 지도가 주어졌을 때,
* + 유턴을 하지 않고 마을의 모든 구역을 돌아다닐 수 있다는 것은
* 막다른 길이 없다는 것과 같은 뜻이다
* + 유턴을 하지 않고 마을의 모든 구역을 돌아다닐 수 없다는 것은
* 막다른 길이 있다는 것과 같은 뜻이다
* # 어떤 구역에 들어갔다고 가정하자
* 그 구역에 들어가기 위해서는 분명 들어가는 길이 있어야 하므로
* 적어도 그 구역과 인접한 길이 하나이상 있다
* 이때, 들어가는 길 외에 다른 길이 없다면
* 그 구역에서 나올때 들어갔던 길을 통해서 나와야 한다
* 즉, 유턴을 해야하므로 이 구역은 막다른 길이다
* -> 막다른 길이 아니기 위해서는 인접한 길이 적어도 2개 이상이어야 함을 알 수 있다
*
* Point
* - 사실 힌트를 봐서 더 어려웠던 문제였다
* 처음에는 모든 사이클을 구하고 사이클끼리 모두 연결되어있는지를 알아내려고 했다
* 물론 이렇게도 풀 수 있겠지만... 그렇게 한참을 헤매고 난뒤
* 문제에서 친절히 막다른 길의 유무만으로 답을 구할 수 있다는 점을 넌지시 알려주는 것을 눈치챘다
* + 아니 힌트 모양이 너무 사이클처럼 보이지 않나요?!?
*
* - 막다른 곳은 인접한 길이 1개 또는 0개 이다
* + 1개일 때만을 막다른 곳으로 생각하지 않도록 주의하자
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
using namespace std;
#define endl '\n'
// Set up : Global Variables
int dy[4] = {+1, 0, 0, -1};
int dx[4] = {0, +1, -1, 0};
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int R, C;
cin >> R >> C;
char B[R][C];
for (int i=0; i<R; i++)
for (int j=0; j<C; j++)
cin >> B[i][j];
// Process
bool isThereBlindLane = false;
for (int i=0; i<R; i++) {
for (int j=0; j<C; j++) {
if (B[i][j] == '.') { /* 임의의 길 */
int cnt = 0; /* 인접한 길의 개수 */
for (int k=0; k<4; k++) {
int ay = i + dy[k];
int ax = j + dx[k];
if (ay >= 0 && ay < R && ax >= 0 && ax < C) {
if (B[ay][ax] == '.') {
cnt++;
}
}
}
if (cnt < 2) { /* 인접한 길이 2개 미만이라면 <= 막다른 곳이라면 */
isThereBlindLane = true;
break;
}
}
}
}
// Control : Output
cout << ((isThereBlindLane) ? 1 : 0) << endl;
}
// Helper Functions
/* None */