def read_data(): N, M = map(int, input().split()) A = [input() for n in range(N)] return N, M, A def solve(N0, M0, A): global Af, ns, ms, N, M N = N0 + 2 M = M0 + 2 n_dots = sum(row.count('.') for row in A) Af = [[True] * M] Af.extend([[True] + [c == '#' for c in row] + [True] for row in A]) Af.append([True] * M) for ns in range(1, N - 1): for ms in range(1, M - 1): if Af[ns][ms]: continue Af[ns][ms] = True for dn, dm in [(1, 0), (-1, 0), (0, 1), (0, -1)]: n = ns + dn m = ms + dm if Af[n][m]: continue Af[n][m] = True if dfs(n, m, dn, dm, n_dots - 2): return True Af[n][m] = False Af[ns][ms] = False return False def dfs(n, m, dn, dm, k): global Af, ns, ms, N, M if k == 0: if n + dn == ns and m + dm == ms: return True elif n - dm == ns and m + dn == ms: return True else: return False if Af[n + dn][m + dm]: dn, dm = -dm, dn # 左90°回転 if Af[n + dn][m + dm]: return False nn = n + dn mm = m + dm Af[nn][mm] = True result = dfs(nn, mm, dn, dm, k-1) Af[nn][mm] = False return result if __name__ == '__main__': N, M, A = read_data() if solve(N, M, A): print('YES') else: print('NO')