$w $h $a $b $c $dx = [1, 0, -1, 0] $dy = [0, 1, 0, -1] $min = 10 ** 10 def checkRange(x, y) return x >= 0 && x < $w && y >= 0 && y < $h end def paint(cx, cy, v) $b[cy][cx] = true if $c[cy][cx] == "#" return end $a[cy][cx] = v 4.times do |i| tx = cx + $dx[i] ty = cy + $dy[i] next if !checkRange(tx, ty) || $b[ty][tx] paint(tx, ty, v) end end $w, $h = gets.split.map(&:to_i) $a = Array.new($h).map{ Array.new($w, 0) } $b = Array.new($h).map{ Array.new($w, false) } $c = Array.new($h) $h.times do |i| $c[i] = gets.strip end v = 1 $h.times do |i| $w.times do |j| if $c[i][j] == "." && $a[i][j] == 0 paint(j, i, v) v += 1 end end end coord = Struct.new(:x, :y) d = Array.new($h).map{ Array.new($w, false) } ah = Array.new bh = Array.new $h.times do |i| $w.times do |j| if $a[i][j] != 0 next end 4.times do |k| tx = j + $dx[k] ty = i + $dy[k] next if !checkRange(tx, ty) if $a[ty][tx] == 1 ah.push(coord.new(j, i)) elsif $a[ty][tx] == 2 bh.push(coord.new(j, i)) end end end end min = 10 ** 10 ah.each do |a| bh.each do |b| v = (a.x - b.x).abs + (a.y - b.y).abs + 1 min = v if v < min end end puts min