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 Perl (v5.18.2) (judge verdict: Time Limit Exceeded)

use bigint;
use Math::BigInt;

chomp($s = <>);
($h, $w) = split(' ', $s);

$white_count = $h * $w;
for($i = 0; $i < $h; $i++){
  chomp($s = <>);
  $s =~ s/\#/1/g;
  $s =~ s/\./0/g;
  $ss .= $s;

  $mask_l .= "0" . ("1" x ($w -1));
  $mask_r .= ("1" x ($w -1)) . "0";
}

# print "b $ss\n";

$s = oct("0b" . $ss);
# print(sprintf("%b", $s), "\n");

$mask_l = oct("0b" . $mask_l);
$mask_r = oct("0b" . $mask_r);

# print(sprintf("%b", $mask_l), "\n");
# print(sprintf("%b", $mask_r), "\n");

$ans = 0;

$all_black = 2 ** ($h * $w) -1;

while($s != $all_black){
  $ans++;

  # print(sprintf("%b", $s), "\n");

  $s = $s |
       (($s & $mask_l) << 1) |
       (($s & $mask_r) >> 1) |
       (($s << $w) & $all_black) |
       ($s >> $w);
}

print "$ans\n";

sub max(){
  my($a) = $_[0];
  my($b) = $_[1];
  if($a > $b){
    $a;
  }else{
    $b;
  }
}

sub min(){
  my($a) = $_[0];
  my($b) = $_[1];
  if($a > $b){
    $b;
  }else{
    $a;
  }
}