// Slower C++ solution:
#include<stdio.h>  

#include<string.h>  

#include<queue>  

using namespace std;  

const int maxn=1005;  

int n,m,k,dx[]={-1,1,0,0},dy[]={0,0,1,-1},vis[maxn][maxn];  

char map[maxn][maxn];  

struct maze  

{  

    int x,y,time;  

};  

maze bfs(int bx,int by,char ch)  

{  

    memset(vis,0,sizeof(vis));  

    queue<maze> q;  

    maze st={bx,by,0};  

    q.push(st);vis[bx][by]=1;  

    while(!q.empty())  

    {  

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

        if(map[st.x][st.y]==ch)  

        {  

            return st;  

        }  

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

        {  

            int tx=st.x+dx[i],ty=st.y+dy[i];  

            if(tx<0||tx>=n||ty<0||ty>=m||map[tx][ty]=='X') 

            {  

                continue;  

            }  

            maze tp={tx,ty,st.time+1};  

            if(!vis[tx][ty])  

            {  

                vis[tx][ty]=1;  

                q.push(tp);  

            }  

        }  

    }  

}  

int main()  

{  

    while(~scanf("%d%d%d",&n,&m,&k))  

    {  

        int bx,by;  

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

        {  

            scanf("%s",map[i]);  

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

            {  

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

                {  

                    bx=i;by=j;  

                    map[i][j]='0';  

                }  

            }  

        }  

        int ans=0;  

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

        {  

            maze tp=bfs(bx,by,map[bx][by]+1);  

            ans+=tp.time;  

            bx=tp.x;by=tp.y;  

        }  

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

    }  

    return 0;  

}


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

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;



#define MAXN 1000

struct node{

    int x,y,st;

    bool operator == (node B) const{

        return x==B.x&&y==B.y;

    }

};

int H,W,N;

char Map[MAXN+5][MAXN+5];

bool vis[MAXN+5][MAXN+5];



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

int bfs(node S,node T){

    queue<node> Q;

    Q.push(S);

    memset(vis,0,sizeof vis);

    while(!Q.empty()){

        node u=Q.front();Q.pop();

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

            node tmp=u;

            tmp.x+=dir[i][0],tmp.y+=dir[i][1],tmp.st++;

            if(tmp.x<1||tmp.x>H||tmp.y<1||tmp.y>W||vis[tmp.x][tmp.y]||Map[tmp.x][tmp.y]=='X')

                continue;

            if(tmp==T)

                return tmp.st;

            vis[tmp.x][tmp.y]=1;

            Q.push(tmp);

        }

    }

    return -1;

}



pair<int,int> pos[10];



int main(){

    scanf("%d%d%d",&H,&W,&N);

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

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

    node S;

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

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

            if(Map[i][j]!='.'&&Map[i][j]!='X'&&Map[i][j]!='S')

                pos[Map[i][j]-'1'+1]=make_pair(i,j);

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

                S.x=i,S.y=j,S.st=0;

        }

    int Ans=0;

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

        Ans+=bfs(S,(node){pos[i].first,pos[i].second,0});

        S=(node){pos[i].first,pos[i].second,0};

    }

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

}