#include #include using namespace std; using namespace atcoder; #define rep(i, n) REP(i, 0, n) #define REP(i, s, e) for (ll i = (s); i < (ll)(e); i++) #define repr(i, n) REPR(i, n, 0) #define REPR(i, s, e) for (ll i = (ll)(s - 1); i >= (ll)(e); i--) #define all(r) r.begin(), r.end() #define rall(r) r.rbegin(), r.rend() typedef long long ll; typedef vector vi; typedef vector vl; template bool chmax(T& a, const U& b) { if (a >= b) return false; a = b; return true; } template bool chmin(T& a, const U& b) { if (a <= b) return false; a = b; return true; } void yes_no(bool f, string yes = "Yes", string no = "No") { cout << (f ? yes : no) << "\n"; } void solve() { int h, w; cin >> h >> w; vector s(h); rep(i, h) cin >> s[i]; int tot = 0; rep(i, h) rep(j, w) if (s[i][j] == '.')++ tot; int dx[] = {0, -1, 0, 1}; int dy[] = {-1, 0, 1, 0}; auto isOutOfRange = [](int h, int w, int H, int W) { return h < 0 || h >= H || w < 0 || w >= W; }; auto jd = [&](int sy, int sx, int d) { int cnt = 0; int right = 0; int x = sx, y = sy; vector used(h, vi(w)); while (1) { int nx = x + dx[d], ny = y + dy[d]; int nd = d; if (isOutOfRange(ny, nx, h, w) || s[ny][nx] == '#' || used[ny][nx]) { nd = (d + 1) % 4; nx = x + dx[nd], ny = y + dy[nd]; if (isOutOfRange(ny, nx, h, w) || s[ny][nx] == '#' || used[ny][nx]) { nd = (d + 3) % 4; nx = x + dx[nd], ny = y + dy[nd]; if (isOutOfRange(ny, nx, h, w) || s[ny][nx] == '#') { return false; } ++right; } } cnt++; y = ny; x = nx; d = nd; used[y][x] = 1; if (sy == y && x == sx) { return cnt == tot && right <= 1; } } return false; }; rep(i, h) rep(j, w) { if (s[i][j] == '.') { rep(k, 4) { if (jd(i, j, k)) { cout << "YES" << '\n'; return; } } } cout << "NO" << '\n'; return; } } int main() { cin.tie(0); ios::sync_with_stdio(false); int t = 1; // cin >> t; rep(ti, t) solve(); return 0; }