// Slower C++ solution:
//

// Create by 神舟 on 2015-02-21

//



#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <cstdlib>

#include <algorithm>

#include <cctype>

#include <stack>

#include <queue>

#include <map>

#include <string>

#include <set>

#include <vector>

using namespace std;



#define CLR(x) memset(x,0,sizeof x)

#define ll long long

#define inf 0x3f3f3f3f

const int maxn=1e3+5;

const int MOD=5e5+5;

int n,m,t,sx,sy,ex,ey;

char word[maxn][maxn];

int path[maxn][maxn];

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



struct pnt

{

    int x,y;

    pnt(int x=0,int y=0):x(x),y(y){};

};



void bfs()

{

    memset(path,0x3f,sizeof path);

    queue <pnt> que;

    pnt p,np;

    p.x=sx,p.y=sy;

    path[sx][sy]=0;

    que.push(p);

    while(!que.empty()){

        p=que.front();que.pop();

        if(p.x==ex&&p.y==ey) {return;}

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

            np.x=p.x+dir[i][0];

            np.y=p.y+dir[i][1];

            if(np.x>0 && np.x<=n && np.y>0 && np.y<=m && path[np.x][np.y]>path[p.x][p.y]+1 && word[np.x][np.y]!='X')

            {

                path[np.x][np.y]=path[p.x][p.y]+1;

                que.push(np);

            }

        }

    }

}

int main()

{

#ifdef LOCAL

	freopen("in.txt","r",stdin);

	//freopen("out.txt","w",stdout);

#endif

	ios_base::sync_with_stdio(0);



	while(scanf("%d%d%d",&n,&m,&t)!=EOF){

        ans=0;

        CLR(word);

        for(int i=1;i<=n;scanf("%s",word[i++]+1));

        for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(word[i][j]=='S') word[i][j]='0';

        for(int k=0;k<t;k++){

            char tp=k+'0';

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

                if(word[i][j]==tp) sx=i,sy=j;

                if(word[i][j]==tp+1) ex=i,ey=j;

            }

            bfs();

            ans+=path[ex][ey];

            //printf("%d\t",path[ex][ey]);

        }

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

	}



	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.208220211993499x):


#include<iostream>

#include<queue>

#include<string.h>

using namespace std;

char map[1005][1005];

char map1[1005][1005];

int a[1005][1005];

int m,n,q,num=0;

int main()

{

	int x,y;

	cin>>m>>n>>q;

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

	{

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

		{

			cin>>map[i][j];

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

				{

					x=i;

					y=j;

				 map[x][y]='0';

				}

		}

	}

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

		{

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

			{

				map1[i][j]=map[i][j];



			}

		}



	for(int k=1;k<=q;k++)

	{

			queue<int> ac;

			queue<int> ak;



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

		{

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

			{

				map[i][j]=map1[i][j];

				if(map1[i][j]-'0'==k-1)

				{

					x=i;

					y=j;

					map[x][y]='X';

				}

			}

		}

		memset(a,0,sizeof(a));

		ac.push(x);

		ak.push(y);

		while(!ac.empty())

		{

			x=ac.front();

			y=ak.front();

			ac.pop();

			ak.pop();

			if(x+1<m)

			{

				if(map[x+1][y]!='X')

				{

					if(map[x+1][y]-'0'==k)

					{

						num+=a[x][y];

						num+=1;

						break;

					}

						map[x+1][y]='X';

						ac.push(x+1);

						ak.push(y);

						a[x+1][y]=a[x][y]+1;

				}

			}

				if(x-1>=0)

				{

					if(map[x-1][y]!='X')

					{



						if(map[x-1][y]-'0'==k)

						{

							num+=a[x][y]+1;

							break;

						}

						map[x-1][y]='X';

						ac.push(x-1);

						ak.push(y);

						a[x-1][y]=a[x][y]+1;

					}

				}

			if(y+1<n)

			{

				if(map[x][y+1]!='X')

				{



					if(map[x][y+1]-'0'==k)

					{

						num+=a[x][y]+1;

						break;

					}



						map[x][y+1]='X';

						ac.push(x);

						ak.push(y+1);

						a[x][y+1]=a[x][y]+1;

				}

			}

			if(y-1>=0)

			{

				if(map[x][y-1]!='X')

				{



					if(map[x][y-1]-'0'==k)

					{

						num+=a[x][y]+1;

						break;

					}



						map[x][y-1]='X';

						ac.push(x);

						ak.push(y-1);

						a[x][y-1]=a[x][y]+1;

				}

			}

		}

	}

	cout<<num<<endl;

	return 0;

}