/*
记忆化搜索
题意:左上角移动到右下角的路径有几条,每个位置上的数代表要走的步数,只能向右或向下移动
*/
#include<iostream>
using namespace std;
__int64 dp[36][36], map[36][36];
int n;
__int64 dfs(int x, int y)
{
if(x == n-1 && y == n-1) return 1;
if(!dp[x][y]) return 0;
if(map[x][y]) return map[x][y];
int i;
__int64 xx, yy;
for( i=0; i < 2; i++)
{
if(i)
xx = x, yy = y + dp[x][y];
else
xx = x + dp[x][y], yy = y;
if(xx >= 0 && xx < n && yy >= 0 && yy < n)
map[x][y] += dfs(xx, yy);
}
return map[x][y];
}
int main()
{
while(scanf("%d", &n) != EOF && n != -1)
{
char str[36];
int i, j;
for( i=0; i < n; i++ )
{
scanf("%s", str);
for( j=0; j < n; j++ )
dp[i][j] = str[j] - '0';
}
memset(map, 0, sizeof(map));
__int64 count = dfs(0, 0);
printf("%I64d\n", map[0][0]);
}
return 0;
}