// Slower C++ solution:
#include<cstdio>

#include<cstring>

#include<queue>

#define maxn 1002

#define maxc 10

using namespace std;

struct point{

    int r,c;

};

char graph[maxn][maxn];

int len[maxn][maxn];

bool mark[maxn][maxn];

point node[maxc];

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

int main(void){

    int h,w,cheese,tr,tc,answer=0;

    scanf("%d%d%d",&h,&w,&cheese);

    memset(graph,0,sizeof(graph));

    memset(node,0,sizeof(node));

    for(int i=1;i<=h;i++) for(int j=1;j<=w;j++){

        do scanf("%c",&graph[i][j]);

        while(graph[i][j]==' ' || graph[i][j]=='\n');

        if(graph[i][j]>='0' && graph[i][j]<='9'){

            node[graph[i][j]-'0'].r=i;

            node[graph[i][j]-'0'].c=j;

        }

        else if(graph[i][j]=='S'){

            node[0].r=i;

            node[0].c=j;

        }

    }

    for(int cnt=0;cnt<cheese;cnt++){

        memset(len,0,sizeof(len));

        memset(mark,false,sizeof(mark));

        for(int i=0;i<=h+1;i++){mark[i][0]=true;mark[i][w+1]=true;}

        for(int j=0;j<=w+1;j++){mark[0][j]=true;mark[h+1][j]=true;}

        queue<point> q;

        q.push(node[cnt]);

        len[node[cnt].r][node[cnt].c]=0;

        point ongo,togo;

        while(!q.empty()){

            ongo=q.front();

            q.pop();

            if(mark[ongo.r][ongo.c]) continue;

            mark[ongo.r][ongo.c]=true;

            if(ongo.r==node[cnt+1].r && ongo.c==node[cnt+1].c){

                answer+=len[ongo.r][ongo.c];

                break;

            }

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

                togo.r=ongo.r+dir[i][0];togo.c=ongo.c+dir[i][1];

                if(mark[togo.r][togo.c]==false && graph[togo.r][togo.c]!='X'){

                    len[togo.r][togo.c]=len[ongo.r][ongo.c]+1;

                    q.push(togo);

                }

            }

        }

    }

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

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.1550675600684832x):
#include<stdio.h>

#include<vector>

#include<queue>

#include<string.h>

#include<iostream>

#include<algorithm>

#define INF 1000000000

#define MAXN 100005

using namespace std;

int mmin=11;

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

int a[1005][1005];int m,n,k,sx,sy;

struct node{

    int x,y,cost;

};

int bfs(int x,int y,int s)

{

    queue<node>q;

    bool vis[1005][1005]={0};

    node now={x,y,0};

    q.push(now);

    while(!q.empty())

    {

        now=q.front();q.pop();

        if(a[now.x][now.y]==s)break;

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

        {

            int xx=now.x+step[i][0],yy=now.y+step[i][1];

            if(!vis[xx][yy]&&a[xx][yy]!=-1){

                vis[xx][yy]=1;

                node temp={xx,yy,now.cost+1};

                q.push(temp);



            }

        }

    }

    //cout<<now.cost<<endl;

    sx=now.x;sy=now.y;

    return now.cost;

}

int main()

{

    scanf("%d%d%d",&n,&m,&k);

    memset(a,-1,sizeof(a));

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

        string x;cin>>x;

        for(int j=1;j<=m;j++)

        {

            char c=x[j-1];

            if(c=='S'){a[i][j]=0;sx=i;sy=j;}

            else if(c=='X')a[i][j]=-1;

            else if(c=='.')a[i][j]=0;

            else a[i][j]=c-'0';

        }

    }

    int sum=0;

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

    {

        sum+=bfs(sx,sy,i);

    }

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

}