import java.util.* fun main(arr:Array) { val (w,h) = readLine()!!.split(" ").map { it.toInt() } val map = (1..h).map { readLine()!!.toCharArray() } val groupMap = (1..h).map { (1..w).map { 0 }.toMutableList() }.toMutableList() var mapIndex = 1 for(r in map.indices) { for(c in map[r].indices) { if(map[r][c] == '#') { continue } if(groupMap[r][c] > 0) { continue } val queue = LinkedList() queue.add(Pos(r,c)) groupMap[r][c] = mapIndex while (queue.isNotEmpty()) { val current = queue.pop() for(newR in (current.row-1..current.row+1)) { if(newR < 0) { continue } if(newR >= h) { continue } for(newC in (current.col-1..current.col+1)) { if(newC < 0) { continue } if(newC >= w) { continue } if(newR == current.row && newC == current.col) { continue } if(newR != current.row && newC != current.col) { continue } if(groupMap[newR][newC] > 0) { continue } if(map[newR][newC] == '#') { continue } groupMap[newR][newC] = mapIndex queue.push(Pos(newR,newC)) } } } mapIndex ++ } } var ans = w*h for(r1 in map.indices) { for(c1 in map[r1].indices) { if(map[r1][c1] == '#') { continue } for(r2 in map.indices) { for(c2 in map.indices) { if(map[r2][c2] == '#') { continue } if(groupMap[r1][c1] == groupMap[r2][c2]) { continue } val dist = Math.abs(r1-r2) + Math.abs(c1-c2) - 1 ans = Math.min(ans, dist) } } } } println(ans) } class Pos(val row:Int, val col:Int)