// Slower C++ solution:


#include <iostream>

#include <cstdio>

#include <cstring>

#include <queue>



using namespace std;

const int maxn = 1e3 + 5;

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

int mp[maxn][maxn];

//bool vis[maxn][maxn];

int d[maxn][maxn];

struct point{

    int x,y;

};

int h,w,n;

 int dis = 0;

void bfs(point &p,int cnt)

{

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

    memset(d, 0, sizeof(d));

    queue<point> q;

    q.push(p);

    while (!q.empty()) {

        point t = q.front();q.pop();

        //vis[t.x][t.y] = true;

        if(mp[t.x][t.y] == cnt + 1) {dis += d[t.x][t.y];p.x = t.x,p.y = t.y;return ;}

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

            int tx = t.x + dir[i][0];

            int ty = t.y + dir[i][1];

            if (tx >= 0 && tx < h && ty >= 0 && ty < w && !d[tx][ty] && mp[tx][ty] != -1) {

                q.push({tx,ty});

                d[tx][ty] = 1 + d[t.x][t.y];

            }

        }

    }

}

int main()

{

    while (scanf("%d%d%d",&h,&w,&n) != EOF) {

        getchar();

        char ch;

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

       // int sx,sy;

        point s;

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

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

                scanf("%c",&ch);

                if(ch == 'S') {s.x = i,s.y = j;mp[i][j] = 0;}

                else if(ch == '.') {mp[i][j] = 0;}

                else if(isdigit(ch)) {mp[i][j] = ch - '0';}

            }

            getchar();

        }

       

        dis = 0;

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

            bfs(s,i);

        }

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

    }

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 4.663019854899907x):
#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; 

}