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 <bits/stdc++.h>
 
using namespace std;
using ll = long long;
// #define int ll
using PII = pair<int, int>;
 
#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
 
template<typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template<typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template<typename T> bool IN(T a, T b, T x) { return a<=x&&x<b; }
template<typename T> T ceil(T a, T b) { return a/b + !!(a%b); }
 
template<typename T> vector<T> make_v(size_t a) { return vector<T>(a); }
template<typename T,typename... Ts>
auto make_v(size_t a,Ts... ts) { 
  return vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));
}
template<typename T,typename V> typename enable_if<is_class<T>::value==0>::type
fill_v(T &t, const V &v) { t=v; }
template<typename T,typename V> typename enable_if<is_class<T>::value!=0>::type
fill_v(T &t, const V &v ) { for(auto &e:t) fill_v(e,v); }
 
template<class S,class T>
ostream &operator <<(ostream& out,const pair<S,T>& a){
  out<<'('<<a.first<<','<<a.second<<')'; return out;
}
template<typename T>
istream& operator >> (istream& is, vector<T>& vec){
  for(T& x: vec) {is >> x;} return is;
}
template<class T>
ostream &operator <<(ostream& out,const vector<T>& a){
  out<<'['; for(T i: a) {out<<i<<',';} out<<']'; return out;
}
 
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; // DRUL
const int INF = 1<<30;
const ll LLINF = 1LL<<60;
ll MOD = 1000000007;

signed main(void)
{
  cin.tie(0);
  ios::sync_with_stdio(false);

  while(1) {
    int n;
    cin >> n;
    if(n == 0) break;
    vector<string> s(n);
    REP(i, n) cin >> s[i];

    auto func = [](vector<char> v) {
      int cnt = 0, ret = 0;
      REP(i, v.size()) {
        if(v[i] == '1') {
          cnt++;
        } else {
          cnt = 0;
        }
        chmax(ret, cnt);
      }
      return ret;
    };

    int ret = 0;
    REP(i, n) {
      vector<char> v;
      REP(j, n) v.push_back(s[i][j]);
      chmax(ret, func(v));
    }
    REP(i, n) {
      vector<char> v;
      REP(j, n) v.push_back(s[j][i]);
      chmax(ret, func(v));
    }
    REP(i, n) {
      vector<char> v;
      int y = 0, x = i;
      while(IN(0,n,x) && IN(0,n,y)) {
        v.push_back(s[y][x]);
        y++, x--;
      }
      chmax(ret, func(v));
    }
    REP(i, n) {
      vector<char> v;
      int y = i, x = n-1;
      while(IN(0,n,x) && IN(0,n,y)) {
        v.push_back(s[y][x]);
        y++, x--;
      }
      chmax(ret, func(v));
    }
    REP(i, n) {
      vector<char> v;
      int y = 0, x = i;
      while(IN(0,n,x) && IN(0,n,y)) {
        v.push_back(s[y][x]);
        y++, x++;
      }
      chmax(ret, func(v));
    }
    REP(i, n) {
      vector<char> v;
      int y = i, x = 0;
      while(IN(0,n,x) && IN(0,n,y)) {
        v.push_back(s[y][x]);
        y++, x++;
      }
      chmax(ret, func(v));
    }
    cout << ret << endl;
  }

  return 0;
}

C++: #include<cstdio>
#include<iostream>
using namespace std;
int main(void){
	int i,j,k,n,max,cnt,x,y;
	int dx[4]={1,1,0,-1},dy[4]={0,-1,-1,-1};
	char xy[225][225];
	while(1){
		max=0;
		cin>>n;
		if(n==0) break;
		for(i=0;i<n;i++) cin>>xy[i];
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				if(xy[i][j]=='1'){
					for(k=0;k<4;k++){
						cnt=1;
						y=i; x=j;
						while(1){
							y=y+dy[k]; x=x+dx[k];
							if(y>=n||x>=n||y<0||x<0||xy[y][x]!='1') break;
							cnt++;
						}
						if(max<cnt) max=cnt;
					}
				}
			}
		}
		cout<<max<<endl;
	}
	return 0;
}

C++: #include<bits/stdc++.h>
using namespace std;
#define rep(i,a) for(int i = 0; i < (a); i++)
bool prime[10002];
int field[256][256];
int dx[] = {1,1,1,0}, dy[] = {-1,1,0,1};
int n;
int func(int x, int y, int k) {
	int cnt = 0;
	while(1) {
		if(x < 0 || x >= n || y < 0 || y >= n) break;
		if(field[y][x] == 0) break;
		x += dx[k], y+= dy[k];
		cnt += 1;
	}
	return cnt;
}
int main() {
	while(cin >> n,n) {
		rep(i,n){
			string str;
			cin >> str;
			rep(j, str.size()){
				field[i][j] = str[j] - '0';
			}
		}
		int ans = 0;
		rep(i, n) {
			rep(j, n) {
				if(field[i][j] == 0) continue;
				rep(k, 3) {
					ans = max(func(j,i,k),ans);
				}
			}
		}
		cout << ans << endl;
	}

	return 0;
}

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

const int SIZE = 255;

int main()
{
	bool table[ SIZE ][ SIZE * 3 ];

	int n;
	while( cin >> n && n ){
		memset( table, 0, sizeof(table) );
		for( int i = 0; i < n; ++i ){
			for( int j = 0; j < n; ++j ){
				char c;
				cin >> c;
				table[ i ][ j + SIZE ] = c == '1' ? true : false;
			}
		}
		int maxLength = 0;
		for( int i = 0; i < n; ++i ){
			int col = 0, row = 0;
			for( int j = 0; j < n; ++j ){
				if( table[ i ][ j + SIZE ] ){
					++col;
					if( maxLength < col ) maxLength = col;
				}else{
					col = 0;
				}
				if( table[ j ][ i + SIZE ] ){
					++row;
					if( maxLength < row ) maxLength = row;
				}else{
					row = 0;
				}
			}
		}
		for( int i = 0; i < n * 2; ++i ){
			int diaL = 0, diaR = 0;
			for( int j = 0; j < n; ++j ){
				if( table[ j ][ i + SIZE - j ] ){
					++diaL;
					if( maxLength < diaL ) maxLength = diaL;
				}else{
					diaL = 0;
				}
				if( table[ j ][ n - 1 - i + j + SIZE ] ){
					++diaR;
					if( maxLength < diaR ) maxLength = diaR;
				}else{
					diaR = 0;
				}
			}
		}
		cout << maxLength << endl;
	}

	return 0;
}

C++: #include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
	int n;
	while(cin >> n,n){
		int m[4]={0},v[4][2] = {{0,-1},{-1,0},{1,-1},{-1,-1}},dp[257][257]={{0,0}};
		char map[257][257];
		for(int y=0;y<257;y++){
			for(int x=0;x<257;x++){
				map[x][y] = '0';
			}
		}
		for(int y=0;y<n;y++){
			for(int x=0;x<n;x++){
				cin >> map[x+1][y+1];
			}
		}

		for(int i=0;i<4;i++){
			memset(dp,0,sizeof(dp));
			for(int k=1;k<=n;k++){
				for(int j=1;j<=n;j++){
					dp[j][k] = map[j][k] - '0' + dp[j+v[i][0]][k+v[i][1]];
					m[i] = max(m[i],dp[j][k]);
				}
			}
		}
		cout << max(m[0],max(m[1],max(m[2],m[3]))) << endl;
	}
}