Problem:
Grid

There is a n × n grid D where each cell contains either 1 or 0.

Your task is to create a program that takes the gird data as input and computes the greatest number of consecutive 1s in either vertical, horizontal, or diagonal direction.

For example, the consecutive 1s with greatest number in the figure below is circled by the dashed-line.

The size of the grid n is an integer where 2 ≤ n ≤ 255.

Input

The input is a sequence of datasets. The end of the input is indicated by a line containing one zero. Each dataset is formatted as follows:

n
D11 D12 ... D1n
D21 D22 ... D2n
.
.
Dn1 Dn2 ... Dnn

Output

For each dataset, print the greatest number of consecutive 1s.

Sample Input

5
00011
00101
01000
10101
00010
8
11000001
10110111
01100111
01111010
11111111
01011010
10100010
10000001
2
01
00
3
000
000
000
0

Output for the Sample Input

4
8
1
0

Solution in Ruby (judge verdict: Accepted)

def rotate90 array
  length = array.size
  rotated = Array.new(length).map{Array.new(length)}
  for y in 0...length
    for x in 0...length
      rotated[x][length - 1 - y] = array[y][x]
    end
  end
  rotated
end

def solveInRowColumn array
  n = array.size
  maxLengthInRow = -1
  maxLengthInColumn = -1
  n.times do |j|
    currentInRow = 0
    currentInColumn = 0
    maxInRow = 0
    maxInColumn = 0
    n.times do |i|
      #横
      if array[j][i] == 1
        if (i > 0 && array[j][i - 1] == 1) || i == 0
          currentInRow += 1
        else
          currentInRow = 1
        end
        maxInRow = [maxInRow, currentInRow].max
      end
      #縦
      if array[i][j] == 1
        if(i > 0 && array[i - 1][j] == 1) || i == 0
          currentInColumn += 1
        else
          currentInColumn = 1
        end
        maxInColumn = [maxInColumn, currentInColumn].max
      end
    end
    #全体での最大値更新
    maxLengthInRow = [maxInRow, maxLengthInRow].max
    maxLengthInColumn = [maxInColumn, maxLengthInColumn].max
  end
  [maxLengthInRow, maxLengthInColumn].max
end

def solveToDiagonal array
  n = array.size
  maxLength = -1
  n.times do |i|
    current = 0
    max = 0
    i.downto(0) do |j|
      if array[i - j][j] == 1
        if((i > 0 && j >= 0) && array[i -j - 1][j + 1] == 1) || i - j == 0
          current += 1
        else
          current = 1
        end
        max = [max, current].max
      end
    end
    maxLength = [max, maxLength].max
  end
  maxLength
end

while (n = $stdin.gets.to_i) != 0
  grid = Array.new
  n.times do
    grid << $stdin.gets.chomp.split("").map(&:to_i)
  end
  p [solveInRowColumn(grid), solveToDiagonal(grid), solveToDiagonal(grid.reverse!().each{|r| r.reverse!}), solveToDiagonal(rotate90(grid)), solveToDiagonal(rotate90(grid.reverse!().each{|r| r.reverse!}))].max
end