// Slower C++ solution:


#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;

}




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

#include<cstdio>

#include<queue>

#include<cstring>

#include<algorithm>

using namespace std;

typedef long long ll;

typedef pair<int,int>P;

const int Max_n=1100;



int n,m,d;

struct Node{

    int x,y,d;

    Node(int xx,int yy,int dd):x(xx),y(yy),d(dd){}

};

char s[Max_n][Max_n];

bool vis[Max_n][Max_n];

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

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



Node bfs(int x1,int y1,int k){

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

    queue<Node>que;

    que.push(Node(x1,y1,0));

    vis[x1][y1]=1;

    while(!que.empty()){

        Node node=que.front();que.pop();

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

        if(k==s[x][y]-'0')return node;

        int d=node.d;

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

            int X=x+dx[i],Y=y+dy[i];

            if(!vis[X][Y]&&(s[X][Y]=='S'||s[X][Y]=='.'||(s[X][Y]>='1'&&s[X][Y]<='9'))){

                vis[X][Y]=1;

                que.push(Node(X,Y,d+1));

            }

        }

    }

}



int main()

{

    while(~scanf("%d%d%d",&n,&m,&d)){

        memset(s,0,sizeof(s));

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

        int x,y;

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

            for(int j=1;j<=m;j++)

            if(s[i][j]=='S'){x=i;y=j;}

        }

        int sum=0;

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

            Node node=bfs(x,y,i);

            sum+=node.d;

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

        }

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

    }

    return 0;

}