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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int H = sc.nextInt();
        int W = sc.nextInt();
        String[][] A = new String[H][W];
        String[][] R = new String[H][W];
        for (int i=0; i<H; i++) {
            String row = sc.next();
            for (int k=0; k<row.length(); k++) {
                A[i][k] = String.valueOf(row.charAt(k));
                R[i][k] = String.valueOf(row.charAt(k));
            }
        }
        int loop = 0;
        while (true) {
            loop++;
            int fill = 0;
            for (int i=0; i<H; i++) {
                for (int j = 0; j < W; j++) {
                    A[i][j] = R[i][j];
                }
            }
            for (int i=0; i<H; i++) {
                for (int j=0; j<W; j++) {
                    if (A[i][j].equals(".")) {
                        if (i > 0 && A[i-1][j].equals("#")) {
                            R[i][j] = "#";
                        }
                        if (i+1 < H && A[i+1][j].equals("#")) {
                            R[i][j] = "#";
                        }
                        if (j > 0 && A[i][j-1].equals("#")) {
                            R[i][j] = "#";
                        }
                        if (j+1 < W && A[i][j+1].equals("#")) {
                            R[i][j] = "#";
                        }
                        if (R[i][j].equals(".")) {
                            fill++;
                        }
                    }
                }
            }
            if (fill == 0) {
                break;
            }
        }

        System.out.println(loop);
    }

}