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: Wrong Answer)

while gets
  n=$_.to_i
  break if n==0
  mat,max_len=[],0
  n.times do
    mat<<gets.chomp.to_s
  end
  memo=Array.new(n).map{Array.new(n,0)}
  mat.each.with_index(0) do |item, y|
    x=0
    # puts "x:#{x},n:#{n}"
    while x<n
      id,skip=0,0
      # puts "x:#{x},item[#{x}]=#{item[x]}"
      if item[x]=="."
        id=x
        while item[id]=="."
          # puts "id:#{id},item[#{id}]=#{item[id]}"
          skip+=1
          id+=1
        end
        # puts "skip:0..#{skip-1}"
        (0..skip-1).each do |s|
          memo[x+s][y]=skip-s
          # puts " memo[#{y}][#{x+s}]=#{skip-s}"
        end
        x+=skip
      else
        memo[x][y]=0
        # puts " memo[#{y}][#{x}]=0"
        x+=1
      end
    end
  end

  # memo.each do |line|
  #   p line
  # end

  memo.each do |line|
    # puts "line=>#{line}"
    line.each_with_index do |item,x|
      if item>max_len
        cont=true
        if x+item<=n
          # puts "[LOOP(target length)] #{item}times"
          item.times do |m|
            # puts "item=#{item},line[#{x+m}]=#{line[x+m]}"
            break unless cont=(item<=line[x+m])
            # puts "cont:#{cont}"
          end
          max_len=item if cont
          # puts "NEW max_len=#{max_len}" if cont
        end
      end
    end
  end

  p max_len
end