Problem:
正方形探索

縦に n 行、横に n 列並べられた、合計 n × n のマス目があります。いくつかのマス目には印がついています。各マス目の印の状態を読み込み、印のついていないマス目だけからなる最大の正方形の辺の長さを出力として表示するプログラムを作成してください。

たとえば各データセットで以下のようなデータが与えられます。

10
...*....**
..........
**....**..
........*.
..*.......
..........
.*........
..........
....*..***
.*....*...

入力データの一行が、一行のマス目を表現します。入力データの文字列のうち、.（ピリオド）は印のついていないマス目、*（アスタリスク）は印のついているマス目を示しています。

上記の例では、下図の 0 で示される正方形が最大となります。

...*....**
..........
**....**..
...00000*.
..*00000..
...00000..
.*.00000..
...00000..
....*..***
.*....*...

よって、5 と出力すれば正解になります。

なお、すべてのマス目に印がついている場合には、0 を出力してください。

Input

上記形式で複数のデータセットが与えられます。
n が 0 のとき入力の最後とします。n は 1000 以下とします。入力データの文字列には、ピリオド、アスタリスク、改行以外の文字は含まれません。データセットの数は 50 を超えません。

Output

各データセットに対し、最大の正方形の辺の長さ（整数）を１行に出力して下さい。

Sample Input

10
...*....**
..........
**....**..
........*.
..*.......
..........
.*........
..........
....*..***
.*....*...
10
****.*****
*..*.*....
****.*....
*....*....
*....*****
..........
****.*****
*..*...*..
****...*..
*..*...*..
0

Output for the Sample Input

5
3

Solution in C# (judge verdict: Wrong Answer)

using System;

namespace AOJ.Volume0
{
    public class SquareSearching
    {
        public static void Main()
        {
            while (true)
            {
                int size = int.Parse(Console.ReadLine());
                if (size == 0) { break; }

                var map = new int[size, size];
                int answer = 0;
                for (int i = 0; i < size; i++)
                {
                    string line = Console.ReadLine();
                    for (int j = 0; j < size; j++)
                    {
                        if (i == 0)
                        {
                            // ◆1行目
                            // 単純に"."→1、"*"→0の置き換え
                            map[j, i] = line.Substring(j, 1) == "." ? 1 : 0;
                            answer = Math.Max(answer, map[j, i]);
                        }
                        else if (i == 1)
                        {
                            // ◆2行目
                            // "*"→0
                            // "."の場合は上、左、左上すべて1の場合2を設定(それ以外の場合は1)
                            if (line.Substring(j, 1) == "*") { map[j, i] = 0; }
                            else
                            {
                                if (j == 0) { map[j, i] = 1; }
                                else if (map[j - 1, i] == 1 && map[j, i - 1] == 1 && map[j - 1, i - 1] == 1)
                                {
                                    map[j, i] = 2;
                                }
                                else { map[j, i] = 1; }
                            }
                            answer = Math.Max(answer, map[j, i]);
                        }
                        else
                        {
                            // ◆3行目以降
                            // "*"→0
                            // "."→上、左、左上の数字のうち最小値+1
                            if (line.Substring(j, 1) == "*") { map[j, i] = 0; }
                            else
                            {
                                if (j == 0) { map[j, i] = 1; }
                                else
                                {
                                    int min = map[j, i - 1];
                                    min = Math.Min(min, map[j - 1, i]);
                                    min = Math.Min(min, map[j - 1, i - 1]);
                                    map[j, i] = min + 1;
                                }
                            }
                            answer = Math.Max(answer, map[j, i]);
                        }
                    }
                }
                Console.WriteLine(answer);
            }
        }
    }
}