#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=1e9;
//answer
long long ans;
//solve
int Hu,Hl,W;
int U[1510][1510],L[1510][1510];
int Left[1510][1510],Right[1510][1510];
int Top[1510][1510],Bottom[1510][1510];
int Min[1510][1510],Max[1510][1510];
//left right top bottom min max
void init()
{
	//left&&right
	for(int i=1;i<=Hl;i++)
		for(int j=1;j<=W;j++)
		{
			Left[i][j]=INF;
			Right[i][j]=-INF;
			if(L[i][j]==-1)continue;
			if(i==1){
				Left[i][j]=j;
				Right[i][j]=j;
			}
			if(i>1){
				Left[i][j]=min(Left[i][j],Left[i-1][j]);
				Right[i][j]=max(Right[i][j],Right[i-1][j]);
			}
			if(j>1){
				Left[i][j]=min(Left[i][j],Left[i][j-1]);
				Right[i][j]=max(Right[i][j],Right[i][j-1]);
			}
		}
	//Min&&Max
	for(int i=Hu;i>=1;i--)
		for(int j=W;j>=1;j--)
		{
			Min[i][j]=INF;
			Max[i][j]=-INF;
			if(U[i][j]==-1)continue;
			if(i==Hu){
				Min[i][j]=j;
				Max[i][j]=j;
			}
			if(i<Hu){
				Min[i][j]=min(Min[i][j],Min[i+1][j]);
				Max[i][j]=max(Max[i][j],Max[i+1][j]);
			}
			if(j<W){
				Min[i][j]=min(Min[i][j],Min[i][j+1]);
				Max[i][j]=max(Max[i][j],Max[i][j+1]);
			}
		}
	//top
	for(int i=1;i<=Hu;i++)
		for(int j=1;j<=W;j++)
		{
			if(U[i][j]==-1){
				Top[i][j]=INF;
				continue;
			}
			Top[i][j]=i;
			if(i>1)Top[i][j]=min(Top[i][j],Top[i-1][j]);
			if(j>1)Top[i][j]=min(Top[i][j],Top[i][j-1]);
		}
	//bottom
	for(int i=Hl;i>=1;i--)
		for(int j=W;j>=1;j--)
		{
			if(L[i][j]==-1){
				Bottom[i][j]=-INF;
				continue;
			}
			Bottom[i][j]=i;
			if(i<Hl)Bottom[i][j]=max(Bottom[i][j],Bottom[i+1][j]);
			if(j<W)Bottom[i][j]=max(Bottom[i][j],Bottom[i][j+1]);
		}
	return ;
}
//dp[i][j]:min x,  (x,y) left<=i<=j<=right
int dp[1510][1510];
void getdp()
{
	for(int i=1;i<=W;i++)
		for(int j=i;j<=W;j++)
			dp[i][j]=INF;
	for(int i=1;i<=Hl;i++)
		for(int j=1;j<=W;j++)
			if(Left[i][j]!=INF)
				dp[Left[i][j]][Right[i][j]]=
				min(dp[Left[i][j]][Right[i][j]],i);
	for(int i=2;i<=W;i++)
		for(int j=i;j<=W;j++)
			dp[i][j]=min(dp[i][j],dp[i-1][j]);
	for(int i=1;i<=W;i++)
		for(int j=W-1;j>=i;j--)
			dp[i][j]=min(dp[i][j],dp[i][j+1]);
	return ;
}
int bottom(int a)
{
	return Bottom[1][a];
}
int top(int a)
{
	return Top[Hu][a];
}
int MeetingPoint(int a,int b)
{
	if(dp[a][b]>bottom(a)||dp[a][b]>bottom(b))
		return INF;
	return dp[a][b];
}
int f1[1510];//(x,y) ok&&x<=r
int f2[1510][1510];//(x,y) x<=r&&Right<=i
int f3[1510][1510];//(x,y) x<=r&&Left>=i
int f4[1510][1510];//(x,y) i<=Left&&Right<=j
void getf()
{
	//init
	for(int i=1;i<=Hl;i++)
		for(int j=1;j<=W;j++)
		{
			if(Left[i][j]==INF)continue;
			f1[i]+=L[i][j];
			f2[Right[i][j]][i]+=L[i][j];
			f3[Left[i][j]][i]+=L[i][j];
			f4[Left[i][j]][Right[i][j]]+=L[i][j];
		}
	//calc
	for(int i=1;i<=Hl;i++)
		f1[i]+=f1[i-1];
	
	for(int i=1;i<=W;i++)
		for(int j=1;j<=Hl;j++)
			f2[i][j]+=f2[i][j-1];
	for(int i=1;i<=W;i++)
		for(int j=1;j<=Hl;j++)
			f2[i][j]+=f2[i-1][j];
	
	for(int i=1;i<=W;i++)
		for(int j=1;j<=Hl;j++)
			f3[i][j]+=f3[i][j-1];
	for(int i=W;i>=1;i--)
		for(int j=1;j<=Hl;j++)
			f3[i][j]+=f3[i+1][j];
	
	for(int i=W;i>=1;i--)
		for(int j=1;j<=W;j++)
			f4[i][j]+=f4[i+1][j];
	for(int i=1;i<=W;i++)
		for(int j=1;j<=W;j++)
			f4[i][j]+=f4[i][j-1];
	return ;
}
int BothReachable(int a,int b,int r)
{
	if(MeetingPoint(a,b)>r)return 0;
	r=min(r,bottom(a));r=min(r,bottom(b));
	return f1[r]-f2[b-1][r]-f3[a+1][r]+f4[a+1][b-1];
}
int Reachable(int a)
{
	return BothReachable(a,a,Hl);
}
int q[1510],Has[1510];
void solve()
{
	init();
	getdp();
	getf();
	for(int i=1;i<Hu;i++)
	{
		long long curans=0;
		int now=1,nnow=1;
		int head=1,tail=0;
		for(int j=1;j<=W;j++)
		{
			if(Min[i][j]==INF)continue;
			while(now<=Max[i][j]){
				if(top(now)<=i){
					int val=Reachable(now);int lst=0;
					while(head<=tail&&bottom(q[tail])<=bottom(now)){
						int V=
							BothReachable(q[tail],now,bottom(q[tail]))
						-	BothReachable(q[tail],now,lst);
						Has[q[tail]]-=V;curans-=V;
						lst=bottom(q[tail]);tail--;
					}
					if(head<=tail){
						int V=
							BothReachable(q[tail],now,bottom(now))
						-	BothReachable(q[tail],now,lst);
						Has[q[tail]]-=V;curans-=V;
					}
					q[++tail]=now;
					Has[now]=val;
					curans+=val;
				}
				now++;
			}
			while(nnow<Min[i][j]){
				curans-=Has[nnow];
				if(head<=tail&&q[head]==nnow)
					head++;
				nnow++;
			}
			ans+=U[i][j]*curans;
		}
	}
	//clear
	
	//f
	for(int i=0;i<=Hl;i++)f1[i]=0;
	for(int i=0;i<=W+1;i++)
		for(int j=0;j<=Hl;j++)
			f2[i][j]=f3[i][j]=0;
	for(int i=0;i<=W+1;i++)
		for(int j=0;j<=W+1;j++)
			f4[i][j]=0;
	//left&right&top&bottom&min&max
	for(int i=1;i<=Hl;i++)
		for(int j=1;j<=W;j++)
			Left[i][j]=Right[i][j]=Bottom[i][j]=0;
	for(int i=1;i<=Hu;i++)
		for(int j=1;j<=W;j++)
			Min[i][j]=Max[i][j]=Top[i][j]=0;
	//dp
	for(int i=1;i<=W;i++)
		for(int j=i;j<=W;j++)
			dp[i][j]=0;
	//q&Has
	for(int i=1;i<=W;i++)
		q[i]=Has[i]=0;
	//U,L
	for(int i=1;i<=Hu;i++)
		for(int j=1;j<=W;j++)
			U[i][j]=0;
	for(int i=1;i<=Hl;i++)
		for(int j=1;j<=W;j++)
			L[i][j]=0;
	return ;
}
char a[1510][1510];
int to(char ch){
	if(ch=='#')return -1;
	return ch-'0';
}
void divide(int u,int d,int l,int r)
{
	if(l==r&&u==d)return ;
	if(d-u>r-l){
		int len=d-u+1;
		W=r-l+1;
		Hu=len/2+1;
		Hl=len-len/2;
		for(int i=1;i<=Hu;i++)
			for(int j=1;j<=W;j++)
				U[i][j]=to(a[u+i-1][l+j-1]);
		for(int i=1;i<=Hl;i++)
			for(int j=1;j<=W;j++)
				L[i][j]=to(a[u+Hu-1+i-1][l+j-1]);
		
		long long tans=ans;
		solve();
//		printf("%d %d %d %d:%lld\n",u,d,l,r,ans-tans);
//		system("pause");
		
		for(int i=1;i<=Hu;i++)
			for(int j=1;j<=W;j++)
				U[i][j]=0;
		for(int i=1;i<=Hl;i++)
			for(int j=1;j<=W;j++)
				L[i][j]=0;
		
		int mid=u+Hu-2;
		divide(u,mid,l,r);
		divide(mid+1,d,l,r);
	}
	else{
		int len=r-l+1;
		W=d-u+1;
		Hu=len/2+1;
		Hl=len-len/2;
		for(int i=1;i<=Hu;i++)
			for(int j=1;j<=W;j++)
				U[i][j]=to(a[u+j-1][l+i-1]);
		for(int i=1;i<=Hl;i++)
			for(int j=1;j<=W;j++)
				L[i][j]=to(a[u+j-1][l+Hu-1+i-1]);
		
		long long tans=ans;
		solve();
//		printf("%d %d %d %d:%lld\n",u,d,l,r,ans-tans);
//		system("pause");
		
		for(int i=1;i<=Hu;i++)
			for(int j=1;j<=W;j++)
				U[i][j]=0;
		for(int i=1;i<=Hl;i++)
			for(int j=1;j<=W;j++)
				L[i][j]=0;
		
		int mid=l+Hu-2;
		divide(u,d,l,mid);
		divide(u,d,mid+1,r);
	}
	return ;
}
int main()
{
	int n;scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%s",a[i]+1);
	divide(1,n,1,n);
	printf("%lld\n",ans);
	return 0;
}
/*
5
11111
1###1
111#1
1###1
11111

*/

Measured memory_bytes: 92416