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

#include <string.h>  

#include <queue>  

#define MAX_W 1000  

#define MAX_H 1000  

#define MAX_N 9  

  

using namespace std;  

  

char m[MAX_H][MAX_W + 1];  

int w, h, n;  

int gx[MAX_N + 1], gy[MAX_N + 1];  

int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};  

  

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

{  

    int d[MAX_H][MAX_W];  

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

    queue<int> que;  

    que.push(sx * w + sy);  

    d[sx][sy] = 0;  

          

    while(que.size())  

    {  

        int x = que.front()/w, y = que.front()%w;  

        que.pop();  

        if(x == gx && y == gy)  

            break;  

  

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

            int nx = x + dx[di], ny = y + dy[di];  

            if(nx >= 0 && nx < h && ny >= 0 && ny < w && 'X' != m[nx][ny] && -1 == d[nx][ny]){  

                d[nx][ny] = d[x][y] + 1;  

                que.push(nx * w + ny);  

            }  

        }  

    }  

    return d[gx][gy];  

}  

  

void solve()  

{  

    int ans = 0;  

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

        ans += bfs(gx[i], gy[i], gx[i + 1], gy[i + 1]);  

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

}  

  

int main()  

{  

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

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

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

          

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

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

            if('1' <= m[i][j] && '9' >= m[i][j])  

                gx[m[i][j] - '0'] = i, gy[m[i][j] - '0'] = j;  

            else if('S' == m[i][j])  

                gx[0] = i, gy[0] = j;  

        }  

  

    if(w || h)  

        solve();  

    return 0;  

}  


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

#include <queue>



using namespace std;



char mp[1005][1005];

int vis[1005][1005];

int w, h, n;



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

int ans = 0, sx, sy;

int blood = 1;



struct Node{

	int x,y;

	Node(int _x, int _y){

		x = _x, y = _y;

	}

}; 

typedef struct Node Node; 



queue<Node> que;



void bfs(char t){

//	cout<<"sx = "<<sx<<", sy = "<<sy<<endl;

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

	ans = 0;

	bool flag = true;

	while(!que.empty()){

//		cout<<"ans = "<<ans<<"n = "<<n<<endl;

		int size = que.size();

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

			Node node = que.front();

			que.pop();

			int x = node.x, y = node.y;

//			cout<<"x = "<<x<<", y = "<<y<<endl;

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

				int tx = x + dirs[i][0], ty = y + dirs[i][1];

				if(tx >= 0 && tx < h && ty >= 0 && ty < w && vis[tx][ty] == 0 && mp[tx][ty] == t){

					sx = tx, sy = ty;

					ans++;

					flag = false;

					return;

				}else if(tx >= 0 && tx < h && ty >= 0 && ty < w && vis[tx][ty] == 0 &&  mp[tx][ty] != 'X'){

//					cout<<"tx = "<<tx<<", ty = "<<ty<<endl;

					que.push(Node(tx, ty));

					vis[tx][ty] = 1;

				}

			} 

		}

		ans++;

	}

	if(flag) ans = 0;

}



int main(){

	cin>>h>>w>>n;

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

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

	}

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

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

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

				sx = i, sy = j;

			}

		}

	}

	int res = 0;

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

		bfs(i + '0');

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

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

				vis[m][k] = 0;

		while(!que.empty())que.pop();

		res += ans;

	}

	cout<<res<<endl;

	return 0;

}



/**

331

S..

...

..1

*/