// Slower C++ solution:
#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);

}




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

#include <queue>

using namespace std;

const int INF = 100000000;

typedef pair<int,int> Point;

Point AllPoint[1000];

int W,H;

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

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

char map[1000][1000];

int deep[1000][1000];

int N;

void BFS(Point Start,Point Over){

    queue<Point> que;

    int FirstDeep = deep[Start.first][Start.second];

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

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

            deep[i][j] = INF;

        }

    }

    que.push(Start);

    deep[Start.first][Start.second] = FirstDeep;

    while (que.size()){

        Point p = que.front();

        que.pop();

        if (p.first== Over.first&&p.second == Over.second)

            break;

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

            int ix = p.first+x[i];

            int iy = p.second+y[i];

            if (ix>=0&&ix<=H

                &&iy>=0&&iy<=W

                &&deep[ix][iy] == INF

                &&map[ix][iy]!='X'){

                que.push(Point(ix,iy));

                deep[ix][iy] = deep[p.first][p.second]+1;

            }

        }

    }

}







int main(){

    cin >> H >> W;

    cin >> N;

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

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

            cin >> map[i][j];

            if ((int)map[i][j]-48>=1&&(int)map[i][j]-48<=N){

                AllPoint[(int)map[i][j]-48].first = i;

                AllPoint[(int)map[i][j]-48].second = j;



            }

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

                AllPoint[0].first = i;

                AllPoint[0].second = j;

            }

        }

    }

    deep[AllPoint[0].first][AllPoint[0].second] = 0;

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

        BFS(AllPoint[i],AllPoint[i+1]);

    }

    cout << deep[AllPoint[N].first][AllPoint[N].second]<<endl;



    return 0;

}

//#....

//S.##.

//###G.

//#####

//#####



//#S######.#

//......#..#

//.#.##.##.#

//.#........

//##.##.####

//....#....#

//.#######.#

//....#.....

//.####.###.

//....#...G#