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

@data = nil

def solve(n, x, y)
  stack = Array.new
  (x+1...n).each do |i|
    break if @data[i][y] == '*'
    stack << (i - x + 1)
  end

  length = 1
  stack.reverse!
  while stack.size > 0 do
    l = stack.pop
    if isSquare(n, x, y ,l)
      length = l
    else
      break
    end
  end
  length
end

def isSquare(n, x, y, length)
  return false if x + length > n || y + length > n

  #x軸チェック
  (x...x+length).each do |i|
    return false if @data[i][y + length - 1] == '*'
  end
  #y軸チェック
  (y...y+length).each do |j|
    return false if @data[x + length - 1][j] == '*'
  end
  
  true

end

while (n = $stdin.gets.to_i) != 0 do
  @data = Array.new
  n.times do
    @data << $stdin.gets.chomp
  end

  length = 0
  n.times do |x|
    break if x + length > n
    n.times do |y|
      break if y + length> n
      length = [length, solve(n, x, y)].max if @data[x][y] == '.'
    end
  end

  p length
end