Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"fmt"
	"strings"
	"sort"
)

var scanner= bufio.NewScanner(os.Stdin)

func main() {
	for scanner.Scan() {
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}
		mp := make([]string, n)
		for i := range mp {
			scanner.Scan()
			mp[i] = "0" + scanner.Text() + "0"
		}
		tmp := make([]string, n+2)
		for i := range tmp {
			tmp[i] = "0"
		}
		mp = append([]string{strings.Join(tmp, "")}, mp...)
		mp = append(mp, strings.Join(tmp, ""))
		score := make([][][]int, n+2)
		for i := range score {
			score[i] = make([][]int, n+2)
			for j := range score[i] {
				score[i][j] = make([]int, 4)
			}
		}
		max_score := 0
		for i := 1; i < n+1; i++ {
			for j := 1; j < n+1; j++ {
				tmps := mp[i]
				if string(tmps[j]) == "1" {
					score[i][j][0] = score[i - 1][j][0] + 1
					score[i][j][1] = score[i][j - 1][1] + 1
					score[i][j][2] = score[i - 1][j - 1][2] + 1
					score[i][j][3] = score[i - 1][j + 1][3] + 1
					max_score = max(max_score, score[i][j][0], score[i][j][1], score[i][j][2], score[i][j][3])
				}
			}
		}
		fmt.Println(max_score)
	}
}

func max(a, b, c, d, e int) int {
	buf := []int{a, b, c, d, e}
	sort.Ints(buf)
	return buf[len(buf)-1]
}

C++: #include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;

#define rep(i, n) for(int i = 0; i < n; i++)
char field[300][300];

int main(){
  int n;
  while(cin >> n && n){
    rep(i, n)rep(j, n) cin >> field[i][j];
    int res = 0;
    int cnt = 0;
    // yoko
    rep(i, n){
      cnt = 0;
      rep(j, n){
	if(field[i][j] == '1') cnt++;
	else cnt = 0;
	res = max(res, cnt);
      }
    }
    //tate
    rep(i, n){
      cnt = 0;
      rep(j, n){
	if(field[j][i] == '1') cnt++;
	else cnt = 0;
	res = max(res, cnt);
      }
    }
    
    rep(i, n){
      cnt = 0;
      rep(j, i+1){
	if(field[i-j][j] == '1') cnt++;
	else cnt = 0;
	res = max(res, cnt);
      }
    }
    //naname
    rep(i, n){
      cnt = 0;
      rep(j, n-i){
	if(field[n-j-1][i+j] == '1') cnt++;
	else cnt = 0;
	res = max(res, cnt);
      }
    }
    //naname  
    rep(i, n){
      cnt = 0;
      rep(j, n - i){
	if(field[i+j][j] == '1') cnt++;
	else cnt = 0;
      }
      res = max(res, cnt);
    }
    rep(i, n){
      cnt = 0;
      rep(j, n - i){
	if(field[j][i+j] == '1') cnt++;
	else cnt = 0;
      }
      res = max(res, cnt);
    }
    cout << res << endl;
  }
  return 0;
}

C++: #include <iostream>
using namespace std;

char A[300][300];

int main(){
	int n;
	while(cin >> n && n){
		for(int i = 0 ; i < n ; i++)
			for(int j = 0 ; j < n ; j++)
				cin >> A[i][j];
		int ans = 0;
		for(int i = 0 ; i < n ; i++){
			int p = 0;
			for(int j = 0 ; j < n ; j++){
				p += A[i][j] - '0';
			}
			if( p == n ) ans = max(p,ans);
		}
		for(int i = 0 ; i < n ; i++){
			int p = 0;
			for(int j = 0 ; j < n ; j++){
				p += A[j][i] - '0';
			}
			if( p == n ) ans = max(p,ans);
		}
		for(int i = 0 ; i <= n ; i++){
			int p = 0 , c = 0;
			for(int j = 0 ; j <= n ; j++){
				if( i+j >= n ) break;
				p += A[j][i+j] - '0';
				c++;
			}
			if( p == c ) ans = max(p,ans);
		}
		for(int i = 0 ; i <= n ; i++){
			int p = 0 , c = 0;
			for(int j = 0 ; j <= n ; j++){
				if( i+j >= n ) break;
				p += A[i+j][j] - '0';
				c++;
			}
			if( p == c ) ans = max(p,ans);
		}
		for(int i = 0 ; i <= n ; i++){
			int p = 0 , c = 0;
			for(int j = 0 ; j <= n ; j++){
				if( n-1-i-j < 0 ) break;
				p += A[j][n-1-i-j] - '0';
				c++;
			}
			if( p == c ) ans = max(p,ans);
		}
		
		for(int i = 0 ; i <= n ; i++){
			int p = 0 , c = 0;
			for(int j = 0 ; j <= n ; j++){
				if( n-1-i-j < 0 ) break;
				if( i+j >= n ) break;
				p += A[i+j][n-1-i-j] - '0';
				c++;
			}
			if( p == c ) ans = max(p,ans);
		}
		cout << ans << endl;
	}
}

C++: 
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 256

char s[MAX][MAX];
int n;

int findMax(int i, int j, int di, int dj){
	int count = 0, res = 0;

	while(i<n && j<n){
		if(s[i][j] == '1') count++;
		else{
			res = max(res, count);
			count = 0;
		}
		i += di;
		j += dj;
	}

	return max(res, count);
}

int main(void){
	while(cin>>n && n){
		for(int i=0;i<n;i++) cin>>s[i];

		int ans = -1;
		for(int i=0;i<n;i++){
			ans = max(ans, findMax(i,0,0,1));
			ans = max(ans, findMax(0,i,1,0));
			ans = max(ans, findMax(i,0,1,1));
			ans = max(ans, findMax(0,i,1,1));
			ans = max(ans, findMax(i,n-1,1,-1));
			ans = max(ans, findMax(0,i,1,-1));
		}

		cout<<ans<<endl;
	}

	return 0;
}