// Slower C++ solution:


#include<iostream>

#include<queue>

#include<string.h>

using namespace std;

char map[1005][1005];

char map1[1005][1005];

int a[1005][1005];

int m,n,q,num=0;

int main()

{

	int x,y;

	cin>>m>>n>>q;

	for(int i=0;i<m;i++)

	{

		for(int j=0;j<n;j++)

		{

			cin>>map[i][j];

			if(map[i][j]=='S')

				{

					x=i;

					y=j;

				 map[x][y]='0';

				}

		}

	}

	for(int i=0;i<m;i++)

		{

			for(int j=0;j<n;j++)

			{

				map1[i][j]=map[i][j];



			}

		}



	for(int k=1;k<=q;k++)

	{

			queue<int> ac;

			queue<int> ak;



		for(int i=0;i<m;i++)

		{

			for(int j=0;j<n;j++)

			{

				map[i][j]=map1[i][j];

				if(map1[i][j]-'0'==k-1)

				{

					x=i;

					y=j;

					map[x][y]='X';

				}

			}

		}

		memset(a,0,sizeof(a));

		ac.push(x);

		ak.push(y);

		while(!ac.empty())

		{

			x=ac.front();

			y=ak.front();

			ac.pop();

			ak.pop();

			if(x+1<m)

			{

				if(map[x+1][y]!='X')

				{

					if(map[x+1][y]-'0'==k)

					{

						num+=a[x][y];

						num+=1;

						break;

					}

						map[x+1][y]='X';

						ac.push(x+1);

						ak.push(y);

						a[x+1][y]=a[x][y]+1;

				}

			}

				if(x-1>=0)

				{

					if(map[x-1][y]!='X')

					{



						if(map[x-1][y]-'0'==k)

						{

							num+=a[x][y]+1;

							break;

						}

						map[x-1][y]='X';

						ac.push(x-1);

						ak.push(y);

						a[x-1][y]=a[x][y]+1;

					}

				}

			if(y+1<n)

			{

				if(map[x][y+1]!='X')

				{



					if(map[x][y+1]-'0'==k)

					{

						num+=a[x][y]+1;

						break;

					}



						map[x][y+1]='X';

						ac.push(x);

						ak.push(y+1);

						a[x][y+1]=a[x][y]+1;

				}

			}

			if(y-1>=0)

			{

				if(map[x][y-1]!='X')

				{



					if(map[x][y-1]-'0'==k)

					{

						num+=a[x][y]+1;

						break;

					}



						map[x][y-1]='X';

						ac.push(x);

						ak.push(y-1);

						a[x][y-1]=a[x][y]+1;

				}

			}

		}

	}

	cout<<num<<endl;

	return 0;

}




// Faster C++ solution for the same problem (measured speedup: 2.5435951454125463x):
#include<iostream>

#include<cstdio>

#include<queue>

#include<cstring>

#include<vector>

#include<set>

using namespace std;

typedef long long ll;

int H,W,N;

char mm[1005][1005];

bool v[1005][1005];

int xx,yy;

struct node{

    int x,y,step;

};

queue<node> que;

int dx[4]={0,0,1,-1};

int dy[4]={1,-1,0,0};

bool check(int x,int  y){

    if(1<=x&&x<=H&&1<=y&&y<=W&&!v[x][y]&&mm[x][y]!='X')return true;

    else return false;

}

int bfs(int g){

    while(!que.empty())que.pop();

    node t;

    t.x=xx;

    t.y=yy;

    t.step=0;

    v[xx][yy]=1;

    que.push(t);

    while(!que.empty()){

        t=que.front();

        que.pop();

        for(int i=0;i<4;i++){

            int nx=t.x+dx[i];

            int ny=t.y+dy[i];

            if(check(nx,ny)){

                if(mm[nx][ny]==g+'0'){

                    xx=nx;

                    yy=ny;

                    return t.step+1;

                }

                node tt;

                tt.x=nx;

                tt.y=ny;

                tt.step=t.step+1;

                v[nx][ny]=1;

                que.push(tt);

            }

        }

    }

}

int main(){

    while(~scanf("%d%d%d",&H,&W,&N)){

        for(int i=1;i<=H;i++){

            scanf("%s",mm[i]+1);

        }

        for(int i=1;i<=H;i++){

            for(int j=1;j<=W;j++){

                if(mm[i][j]=='S'){

                    xx=i;

                    yy=j;

                }

            }

        }

        int ans=0;

        for(int i=1;i<=N;i++){

            memset(v,0,sizeof(v));

            ans+=bfs(i);

        }

        printf("%d\n",ans);

    }

    return 0; 

}