#include <cstdio>
#include <iostream>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Reachable(a) (BothReachable((a),(a),HL))
using namespace std;
template<class T> void read(T &x)
{
    x=0; int f=1,ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10-'0'+ch;ch=getchar();}
    x*=f;
}
template<class T> inline bool Cmin(T &x,T y) {return x>y?x=y,1:0;}
template<class T> inline bool Cmax(T &x,T y) {return x<y?x=y,1:0;}
typedef long long ll;
const int inf=1e9;
const int maxn=1500+50;
int n;
char s[maxn][maxn];
ll an;
int has[maxn];
int Top[maxn];
int sum1[maxn];
int Bottom[maxn];
int f[maxn][maxn];
int L[maxn][maxn];
int U[maxn][maxn];
int Min[maxn][maxn];
int Max[maxn][maxn];
int Left[maxn][maxn];
int sum2[maxn][maxn];
int sum3[maxn][maxn];
int sum4[maxn][maxn];
int Right[maxn][maxn];
int MeetingPoint[maxn][maxn];
int a[2][maxn][maxn];
void calc_Top(int H,int W)
{
    for(int i=1;i<=H;++i) for(int j=1;j<=W;++j)
    {
        f[i][j]=inf; 
        if(U[i][j])
        { 
            f[i][j]=i;
            if(i!=1) Cmin(f[i][j],f[i-1][j]);
            if(j!=1) Cmin(f[i][j],f[i][j-1]);
        }
    }
    for(int j=1;j<=W;++j) Top[j]=f[H][j];
}
void calc_Bottom(int H,int W)
{
    for(int i=H;i>=1;--i) for(int j=W;j>=1;--j)
    {
        f[i][j]=-inf;
        if(L[i][j])
        {
            f[i][j]=i;
            if(i!=H) Cmax(f[i][j],f[i+1][j]);
            if(j!=W) Cmax(f[i][j],f[i][j+1]);
        }
    }
    for(int j=1;j<=W;++j) Bottom[j]=f[1][j];
}
void init_MeetingPoint(int H,int W)
{
    for(int i=1;i<=W;++i) for(int j=1;j<=W;++j) f[i][j]=inf;
    for(int i=1;i<=H;++i) for(int j=1;j<=W;++j)
    {
        if(Left[i][j]<=Right[i][j]) Cmin(f[Left[i][j]][Right[i][j]],i);
    }
    for(int len=W;len>1;--len) for(int l=1,r=len;r<=W;++l,++r)
    {
        Cmin(f[l+1][r],f[l][r]),Cmin(f[l][r-1],f[l][r]);
    }
    for(int a=1;a<=W;++a) for(int b=a;b<=W;++b)
    {
        MeetingPoint[a][b]=f[a][b]>min(Bottom[a],Bottom[b])?inf:f[a][b];
    }
}
void init_BothReachable(int H,int W)
{
    for(int i=1;i<=H;++i) sum1[i]=0;
    for(int i=1;i<=H;++i) for(int j=1;j<=W;++j) sum2[i][j]=0;
    for(int i=1;i<=H;++i) for(int j=1;j<=W;++j) sum3[i][j]=0;
    for(int i=1;i<=W;++i) for(int j=1;j<=W;++j) sum4[i][j]=0;
    for(int i=1;i<=H;++i) for(int j=1;j<=W;++j)
    {
        if(Left[i][j]<=Right[i][j])
        {
            sum1[i]+=L[i][j];
            if(Right[i][j]!=W) sum2[i][Right[i][j]+1]+=L[i][j];
            if(Left[i][j]!=1) sum3[i][Left[i][j]-1]+=L[i][j];
            if(Right[i][j]!=W&&Left[i][j]!=1) sum4[Left[i][j]-1][Right[i][j]+1]+=L[i][j];
        }
    }
    for(int i=1;i<=H;++i)
    {
        sum1[i]+=sum1[i-1];
        for(int j=1;j<=W;++j) sum2[i][j]+=sum2[i][j-1];
        for(int j=W-1;j>=1;--j) sum3[i][j]+=sum3[i][j+1];
        for(int j=1;j<=W;++j)
        {
            sum2[i][j]+=sum2[i-1][j];
            sum3[i][j]+=sum3[i-1][j];
        }
    }
    for(int len=2;len<=W;++len) for(int l=1,r=len;r<=W;++l,++r)
    {
        sum4[l][r]+=sum4[l+1][r]+sum4[l][r-1]-sum4[l+1][r-1];
    }
}
inline int BothReachable(int a,int b,int r)
{
    Cmin(r,min(Bottom[a],Bottom[b]));
    if(MeetingPoint[a][b]>r) return 0;
    return sum1[r]-sum2[r][b]-sum3[r][a]+sum4[a][b];
}
void divide(int Hl,int Hr,int Wl,int Wr,int k)
{
    if(Hr-Hl+1<Wr-Wl+1) swap(Hl,Wl),swap(Hr,Wr),k^=1;
    if(Hl==Hr) return;
    int H=Hr-Hl+1,W=Wr-Wl+1;
    int HU=H>>1,HL=H-HU;
    for(int i=1;i<=HU;++i) for(int j=1;j<=W;++j) U[i][j]=a[k][Hl+i-1][Wl+j-1];
    for(int i=1;i<=HL;++i) for(int j=1;j<=W;++j) L[i][j]=a[k][Hl+HU+i-1][Wl+j-1];
    for(int i=1;i<=W;++i)
    {
        Left[1][i]=inf,Right[1][i]=-inf;
        if(L[1][i]) 
        {
            Left[1][i]=Right[1][i]=i;
            if(i!=1) Cmin(Left[1][i],Left[1][i-1]);
        }
    }
    for(int i=2;i<=HL;++i) for(int j=1;j<=W;++j)
    {
        Left[i][j]=inf,Right[i][j]=-inf;
        if(L[i][j])
        {
            Cmin(Left[i][j],Left[i-1][j]),Cmax(Right[i][j],Right[i-1][j]);
            if(j!=1) Cmin(Left[i][j],Left[i][j-1]),Cmax(Right[i][j],Right[i][j-1]);
        }
    }
    for(int i=W;i>=1;--i)
    {
        Min[HU][i]=inf,Max[HU][i]=-inf;
        if(U[HU][i])
        {
            Min[HU][i]=Max[HU][i]=i;
            if(i!=W) Cmax(Max[HU][i],Max[HU][i+1]);
        }
    }
    for(int i=HU-1;i>=1;--i) for(int j=W;j>=1;--j)
    {
        Min[i][j]=inf,Max[i][j]=-inf;
        if(U[i][j])
        {
            Cmin(Min[i][j],Min[i+1][j]);
            Cmax(Max[i][j],Max[i+1][j]);
            if(j!=W)
            {
                Cmin(Min[i][j],Min[i][j+1]);
                Cmax(Max[i][j],Max[i][j+1]);
            }
        }
    }
    // for(int i=1;i<=HU;++i) for(int j=1;j<=W;++j)
    // {
    //     debug("%d %d %d %d\n",i,j,Min[i][j],Max[i][j]);
    // }
    calc_Top(HU,W);
    calc_Bottom(HL,W);
    init_MeetingPoint(HL,W);
    init_BothReachable(HL,W);
    // debug("%d %d %d %d %d %d %d %lld ",Hl,Hr,Wl,Wr,k,HU,HL,an);
    int cnt=0,sum=0;
    for(int y=1;y<=HU;++y)
    {
        static int J[maxn]; int hd=1,tl=0;
        int l=1,r=0;
        int now=0;
        for(int x=1;x<=W;++x) if(Min[y][x]<=Max[y][x])
        {
            // debug("---\n");
            while(r<Max[y][x]) 
            {
                ++r; if(Bottom[r]==-inf||Top[r]>y) continue;
                has[r]=Reachable(r);
                now+=has[r];
                if(hd<=tl) 
                {
                    int d=BothReachable(J[tl],r,min(Bottom[J[tl]],Bottom[r]));
                    now-=d;
                    has[J[tl]]-=d;
                }
                while(hd<=tl&&Bottom[J[tl]]<Bottom[r])
                {
                    --tl;
                    if(hd<=tl) 
                    {
                        int d=BothReachable(J[tl],r,min(Bottom[J[tl]],Bottom[r]))-BothReachable(J[tl],r,min(Bottom[J[tl+1]],Bottom[r]));
                        now-=d;
                        has[J[tl]]-=d;
                    }
                }
                J[++tl]=r;
                // debug("ADD %d %d\n",r,now);
                // for(int i=l;i<=r;++i) if(Bottom[i]!=-inf&&Top[i]<=y)
                // {
                //     debug("%d %d\n",i,has[i]);
                // }
            }
            while(l<Min[y][x])
            {
                if(Bottom[l]!=-inf&&Top[l]<=y)
                {
                    now-=has[l];
                    if(hd<=tl)
                    {
                        if(J[hd]==l) ++hd;
                    }
                }
                // debug("DEL %d %d\n",l,now);
                // for(int i=l;i<=r;++i) if(Bottom[i]!=-inf&&Top[i]<=y)
                // {
                //     debug("%d %d\n",i,has[i]);
                // }
                ++l;
            }
            // debug("%d %d %d %d %d\n",y,x,l,r,now);
            // int tim=0;
            // static int vis[maxn][maxn];
            // for(int i=1;i<=HL;++i) for(int j=1;j<=W;++j) vis[i][j]=0;
            // for(int j=l;j<=r;++j) if(Bottom[j]!=-inf&&Top[j]<=y) vis[1][j]=1;
            // for(int i=1;i<=HL;++i) for(int j=1;j<=W;++j) if(L[i][j])
            // {
            //     vis[i][j]|=vis[i][j-1]|vis[i-1][j];
            //     if(vis[i][j]) ++cnt,++tim;
            // }
            // debug("%d\n",tim);
            // sum+=now;
            an+=now*U[y][x];
        }
    }
    // if(sum!=cnt) 
    // {
    //     debug("%d %d %d %d %d %d %d\n",Hl,Hr,Wl,Wr,k,sum,cnt);
    //     for(int i=1;i<=HU;++i) {for(int j=1;j<=W;++j) debug("%d",U[i][j]);debug("\n");}
    //     debug("\n");
    //     for(int i=1;i<=HL;++i) {for(int j=1;j<=W;++j) debug("%d",L[i][j]);debug("\n");}
    // }
    // debug("%lld\n",an);
    divide(Hl,Hl+HU-1,Wl,Wr,k);
    divide(Hl+HU,Hr,Wl,Wr,k);
}
int main()
{
    read(n);
    for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
    for(int i=1;i<=n;++i) for(int j=1;j<=n;++j)
    {
        a[0][i][j]=a[1][j][i]=s[i][j]=='#'?0:s[i][j]-'0';
    }
    // divide(1,10,1,5,1);
    divide(1,n,1,n,0);
    printf("%lld\n",an);
    return 0;
}

Measured memory_bytes: 102144