module main; // Copilotより import std; int N, M; string[] A; alias P = Tuple!(int, "x", int, "y"); auto dir = [P(0, 1), P(1, 0), P(0, -1), P(-1, 0)]; int len = 0; // '.' の個数 bool[][] visited; // 二次元グリッドにおけるハミルトン閉路の検索(深さ優先探索) bool hamiltonianCycle(P[] path, int x, int y) { if (path.length == len) return abs(path[0].x - x) + abs(path[0].y - y) == 1; foreach (d; dir) { int nx = x + d.x, ny = y + d.y; if (nx < 0 || nx >= N || ny < 0 || ny >= M || A[nx][ny] == '#') continue; visited[nx][ny] = true; path ~= P(nx, ny); if (hamiltonianCycle(path, nx, ny)) return true; path.popBack; visited[nx][ny] = false; } return false; } void main() { // 入力 readln.chomp.formattedRead("%d %d", N, M); foreach (_; 0 .. N) A ~= readln.chomp; // 答えの計算と出力 foreach (line; A) len += line.count('.'); visited = new bool[][](N, M); foreach (i; 0 .. N) { foreach (j; 0 .. M) { if (A[i][j] == '#') continue; if (hamiltonianCycle([P(i, j)], i, j)) { writeln("YES"); return; } } } writeln("NO"); }