package main import ( "bufio" "fmt" "os" "strconv" ) var sc = bufio.NewScanner(os.Stdin) func main() { sc.Split(bufio.ScanWords) w, h := nextInt(), nextInt() cave := make([][]byte, h) for i := range cave { cave[i] = []byte(nextLine()) } var sPos [2]int for j, l := range cave { for i, b := range l { if b == '.' { sPos = [2]int{i, j} cave[j][i] = 0 break } } if sPos[0] != 0 && sPos[1] != 0 { break } } q := make([][2]int, 0, 400) q = append(q, sPos) move := [][2]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}} for len(q) > 0 { pos := q[0] q = q[1:] for _, m := range move { nextI, nextJ := pos[0]+m[0], pos[1]+m[1] if cave[nextJ][nextI] == '.' { cave[nextJ][nextI] = 0 q = append(q, [2]int{nextI, nextJ}) } } } for i := byte(0); i < 200; i++ { for j, l := range cave[1 : h-1] { for k, v := range l[1 : w-1] { if v != i { continue } for _, m := range move { nextI, nextJ := k+1+m[0], j+1+m[1] nextV := cave[nextJ][nextI] if nextV == '.' { fmt.Println(i) return } if nextV == '#' { cave[nextJ][nextI] = i + 1 } } } } } } func nextLine() string { sc.Scan() return sc.Text() } func nextInt() int { i, _ := strconv.Atoi(nextLine()) return i }