const val BLOCKED = '#' const val UNSEEN = '.' const val SEEN = ':' const val CHECK = '!' val DELTAS = arrayOf( Pair(-1, 0), Pair(0, -1), Pair(0, 1), Pair(1, 0), ) class Solver(val h: Int, val w: Int, val status: Array, val puzzle: Array) { val dist2root = Array(h) { IntArray(w) } val backreach = Array(h) { IntArray(w) } val altStack = Array(h * w) { Pair(0, 0) } var stackLen = 0 fun push(x: Int, y: Int, dist: Int) { status[x][y] = SEEN dist2root[x][y] = dist backreach[x][y] = dist altStack[stackLen++] = Pair(x, y) } fun isEven(a: Int, b: Int): Boolean { for (i in a..= dist2root[x][y]) { if (!isEven(pos, stackLen)) return false stackLen = pos } backreach[x][y] = minOf(backreach[x][y], backreach[x2][y2]) } return true } fun isSolvable(): Boolean { push(h - 1, w - 1, 0) return dfs(h - 1, w - 1, -1, -1) } } fun main() { val (h, w) = readln().split(' ').map(String::toInt) val status = Array(h) { CharArray(w) } for (i in 0..