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

#include<queue>

#include<cctype>





using namespace std;



int cnt;

char field[1002][1002];

int cost[1002][1002];

int factory[9][2];

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

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



int bfs(int sx, int sy, int gx, int gy) {

    queue< pair<int,int> > que;



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

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

            cost[i][j] = -1;

        }

    }



    que.push(make_pair(sx, sy));

    cost[sx][sy] = 0;



    while(!que.empty()) {

        pair<int, int> p;

        p = que.front();

        que.pop();

        

        if(p.first == gx && p.second == gy) {

            break;

        }



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

            int tx = p.first + x[i]; int ty = p.second + y[i];

            if(field[tx][ty] != 'X' && cost[tx][ty] == -1) {

                que.push(pair<int, int>(tx, ty));

                cost[tx][ty] = cost[p.first][p.second] + 1;

            }

        }

    }

    return cost[gx][gy];

}



int main() {

    int w, h, n, sx, sy;



    cin >> h >> w >> n;



    for (int y = 1; y <= h; y++) {

        for (int x = 1; x <= w; x++) {

            cin >> field[x][y];

            if (field[x][y] == 'S') {

                sx = x;

                sy = y;

            } else if(isdigit(field[x][y])) {

                int tmp = field[x][y] - '0';

                factory[tmp][0] = x;

                factory[tmp][1] = y;

            }

        }

        field[0][y] = 'X';

        field[w + 1][y] = 'X';

    }



    for (int x = 0; x <= w + 1; x++) {

        field[x][0] = 'X';

        field[x][h + 1] = 'X';

    }



    int cnt = 0;

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

        // 次の目的地へ行くで

        cnt += bfs(sx, sy, factory[i][0], factory[i][1]);

        sx = factory[i][0];

        sy = factory[i][1];

    }



    cout << cnt << endl;

}

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