Problem:
Score : 300 points

Problem Statement

You are given a grid of squares with H horizontal rows and W vertical columns, where each square is painted white or black.
HW characters from A_{11} to A_{HW} represent the colors of the squares.
A_{ij} is # if the square at the i-th row from the top and the j-th column from the left is black, and A_{ij} is . if that square is white.

We will repeatedly perform the following operation until all the squares are black:

Every white square that shares a side with a black square, becomes black.

Find the number of operations that will be performed.
The initial grid has at least one black square.

Constraints

1 \leq H,W \leq 1000

A_{ij} is # or ..

The given grid has at least one black square.

Input

Input is given from Standard Input in the following format:

H W
A_{11}A_{12}...A_{1W}
:
A_{H1}A_{H2}...A_{HW}

Output

Print the number of operations that will be performed.

Sample Input 1

3 3
...
.#.
...

Sample Output 1

2

After one operation, all but the corners of the grid will be black. After one more operation, all the squares will be black.

Sample Input 2

6 6
..#..#
......
#..#..
......
.#....
....#.

Sample Output 2

3

Solution in Go (1.6) (judge verdict: Accepted)

package main

import "fmt"

type rect struct {
	h int
	w int
}

func main() {
	var h, w int
	fmt.Scan(&h, &w)
	br := make([][]bool, h)
	for i := range br {
		br[i] = make([]bool, w)
	}
	ar := make([]rect, 0)
	for i := 0; i < h; i++ {
		var s string
		fmt.Scan(&s)
		for j, v := range s {
			if v == '#' {
				br[i][j] = true
				ar = append(ar, rect{h: i, w: j})
			}
		}
	}
	sum := 0
	for {
		temp := []rect{}
		sousa := false
		for _, v := range ar {
			if v.h != 0 {
				if !br[v.h-1][v.w] {
					sousa = true
					br[v.h-1][v.w] = true
					temp = append(temp, rect{h: v.h - 1, w: v.w})
				}
			}
			if v.h != h-1 {
				if !br[v.h+1][v.w] {
					sousa = true
					br[v.h+1][v.w] = true
					temp = append(temp, rect{h: v.h + 1, w: v.w})
				}
			}
			if v.w != 0 {
				if !br[v.h][v.w-1] {
					sousa = true
					br[v.h][v.w-1] = true
					temp = append(temp, rect{h: v.h, w: v.w - 1})
				}
			}
			if v.w != w-1 {
				if !br[v.h][v.w+1] {
					sousa = true
					br[v.h][v.w+1] = true
					temp = append(temp, rect{h: v.h, w: v.w + 1})
				}
			}
		}
		if sousa == false {
			fmt.Println(sum)
			return
		}
		sum++
		ar = temp
	}
}