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 PHP7 (7.0.15) (judge verdict: Time Limit Exceeded)

<?php /*atcoder.php*/

$at = new Atcoder();
$at->main();
unset($at);

class Atcoder{
	private function arrayIn(){
		$buf = explode(" ", fgets(STDIN));
		return $this->killNewLine($buf);
	}
	private function killNewLine($buf = null){
		$buf = str_replace("\r\n", "", $buf);
		$buf = str_replace("\n", "", $buf);
		$buf = str_replace("\r", "", $buf);
		return $buf;
	}

	public function main(){
		$s = $this->arrayIn();
		
		$h = $s[0];
		$w = $s[1];

		$map = array();
		for($i = 0; $i < $h ; $i++){
			$map[] = $this->arrayIn();
		}
		
		$ans = 0;

		while(true){
			/* c */
			$buf = 0;
			for($i = 0; $i < $h; $i++){
				for($j = 0; $j < $w; $j++){
					if("." == $map[$i][0][$j]){
						$buf++;
						break 2;
					}
				}
			}
			if(0 == $buf){
				break;
			}else{
				$buf = 0;
			}
			
			if(($buf + 1) == $h) break;
			
			/* m */ 

			for($i = 0; $i < $h; $i++){
				for($j = 0; $j < $w; $j++){
					if("#" == $map[$i][0][$j]){
						if(0 != $i){
							$map[($i - 1)][0][$j] = "#";
						}
						if(($i + 1) != $h){
							$map[($i + 1)][0][$j] = "n";
						}
						if(0 != $j){
							$map[$i][0][($j - 1)] = "#";
						}
						if(($j + 1) != $w){
							$map[$i][0][($j + 1)] = "n";
						}
					}
				}
			}
			/* rep */
			for($i = 1; $i < $h; $i++){
				$map[$i][0] = str_replace("n", "#", $map[$i][0]);
			}
			/* a++ */
			$ans++;
		}
		
		echo $ans . "\n";

	}
}
?>