stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
/*

*

*/

#include<iostream>

#include<cstring>

#include<cstdio>

#include<cmath>

#include<string>

#include<queue>

#define CLR(ARR,NUM) memset(ARR,NUM,sizeof(ARR))

#define GETNUM(NUM) scanf("%d",&NUM)

#define faster_io() ios_base::sync_with_stdio(false)

using namespace std;

const int MAXN = 1010;

char map[MAXN][MAXN];

bool vis[10][MAXN][MAXN];

struct node{

	int x;

	int y;

	int deep;

	int n;

};

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

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



int main()

{

	CLR(vis,false);

	CLR(map,'X');

	int h,w,n;

	cin >> h >> w >> n;

	getchar();

	int sx,sy;

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

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

			map[i][j]=getchar();

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

				sx=i;

				sy=j;

			}

		}

		getchar();

	}

	node t;

	t.x=sx;

	t.y=sy;

	t.deep=0;

	t.n=0;

	queue<node>q;

	vis[0][sx][sy]=true;

	q.push(t);

	int ans = -1;

	while(!q.empty()){

		node cur=q.front();

		if(cur.n==n){

			ans=cur.deep;

			break;

		}

		q.pop();

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

			int tx=cur.x+dx[i];

			int ty=cur.y+dy[i];

			if(map[tx][ty]!='X'&&!vis[cur.n][tx][ty]){

				node t = cur;

				t.x=tx;

				t.y=ty;

				t.deep++;

				if(map[tx][ty]=='1'+t.n){

					t.n++;

				}

				vis[t.n][tx][ty]=true;

				q.push(t);

			}

		}

	}

	cout << ans << endl;

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 2.4651165851510104x):
#include "cstring"

#include "cstdio"

#include "queue"

using namespace std;



const int maxn=1024;



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

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



char mp[maxn][maxn];

int vis[maxn][maxn];

int wx[10],wy[10];

int n,m,k;



int bfs(int x1,int y1,int x2,int y2)

{

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

	queue<int>qx;qx.push(x1);

	queue<int>qy;qy.push(y1);

	queue<int>qt;qt.push(0);

	vis[x1][y1]=1;

	

	while(!qx.empty())

	{

		int nx=qx.front();qx.pop();

		int ny=qy.front();qy.pop();

		int nt=qt.front();qt.pop();

		

		if(nx==x2 && ny==y2)return nt;

		

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

		{

			int px=nx+dx[i];

			int py=ny+dy[i];

			if(px>=0 && py>=0 && px<n && py<m && mp[px][py]!='X' && !vis[px][py])

			{

				qx.push(px);

				qy.push(py);

				qt.push(nt+1);

				vis[px][py]=1;

			}

		}

		

	}

	

	return 0;

}



int main()

{

	//freopen("f.txt","r",stdin);

	scanf("%d%d%d",&n,&m,&k);

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

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

		{

			mp[i][j]=getchar();

			while(mp[i][j]=='\n' || mp[i][j]=='\0')mp[i][j]=getchar();

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

			{

				wx[mp[i][j]-'0']=i;

				wy[mp[i][j]-'0']=j;

			}

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

			{

				wx[0]=i;

				wy[0]=j;

			}	

		}

	int ans=0;

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

		ans+=bfs(wx[i],wy[i],wx[i+1],wy[i+1]);

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

	return 0;

}
// Slower C++ solution:
#include <queue>

#include <cstring>

#include <iostream>

using namespace std;



const int N = 1111;

const int cx[] = {0, 0, 1, -1}, cy[] = {1, -1, 0, 0};

char maze[N][N];

int step[N][N];

int h, w, n, sx, sy, ans;



int bfs(int cheese){

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

    queue<pair<int, int> > que;

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

    step[sx][sy] = 0;

    while(!que.empty()){

        int x = que.front().first, y = que.front().second;

        que.pop();

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

            int nx = x + cx[i], ny = y + cy[i];

            if(nx < 0 || h <= nx || ny < 0 || w <= ny || maze[nx][ny] == 'X' || step[nx][ny] != -1) continue;

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

            if(maze[nx][ny] - '0' == cheese){

                sx = nx;

                sy = ny;

                return step[nx][ny];

            }

            que.push(make_pair(nx, ny));

        }

    }

    return 0;

}



int main(){

    ios::sync_with_stdio(false);

    cin.tie(NULL);

    while(cin >> h >> w >> n){

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

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

                cin >> maze[i][j];

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

                    sx = i;

                    sy = j;

                }

            }

        ans = 0;

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

            ans += bfs(i);

        cout << ans << endl;

    }

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.1714364774964143x):
#include "cstring"

#include "cstdio"

#include "queue"

using namespace std;



const int maxn=1024;



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

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



char mp[maxn][maxn];

int vis[maxn][maxn];

int wx[10],wy[10];

int n,m,k;



int bfs(int x1,int y1,int x2,int y2)

{

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

	queue<int>qx;qx.push(x1);

	queue<int>qy;qy.push(y1);

	queue<int>qt;qt.push(0);

	vis[x1][y1]=1;

	

	while(!qx.empty())

	{

		int nx=qx.front();qx.pop();

		int ny=qy.front();qy.pop();

		int nt=qt.front();qt.pop();

		

		if(nx==x2 && ny==y2)return nt;

		

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

		{

			int px=nx+dx[i];

			int py=ny+dy[i];

			if(px>=0 && py>=0 && px<n && py<m && mp[px][py]!='X' && !vis[px][py])

			{

				qx.push(px);

				qy.push(py);

				qt.push(nt+1);

				vis[px][py]=1;

			}

		}

		

	}

	

	return 0;

}



int main()

{

	//freopen("f.txt","r",stdin);

	scanf("%d%d%d",&n,&m,&k);

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

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

		{

			mp[i][j]=getchar();

			while(mp[i][j]=='\n' || mp[i][j]=='\0')mp[i][j]=getchar();

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

			{

				wx[mp[i][j]-'0']=i;

				wy[mp[i][j]-'0']=j;

			}

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

			{

				wx[0]=i;

				wy[0]=j;

			}	

		}

	int ans=0;

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

		ans+=bfs(wx[i],wy[i],wx[i+1],wy[i+1]);

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

	return 0;

}
// 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: 1.804514424354798x):
#include "cstring"

#include "cstdio"

#include "queue"

using namespace std;



const int maxn=1024;



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

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



char mp[maxn][maxn];

int vis[maxn][maxn];

int wx[10],wy[10];

int n,m,k;



int bfs(int x1,int y1,int x2,int y2)

{

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

	queue<int>qx;qx.push(x1);

	queue<int>qy;qy.push(y1);

	queue<int>qt;qt.push(0);

	vis[x1][y1]=1;

	

	while(!qx.empty())

	{

		int nx=qx.front();qx.pop();

		int ny=qy.front();qy.pop();

		int nt=qt.front();qt.pop();

		

		if(nx==x2 && ny==y2)return nt;

		

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

		{

			int px=nx+dx[i];

			int py=ny+dy[i];

			if(px>=0 && py>=0 && px<n && py<m && mp[px][py]!='X' && !vis[px][py])

			{

				qx.push(px);

				qy.push(py);

				qt.push(nt+1);

				vis[px][py]=1;

			}

		}

		

	}

	

	return 0;

}



int main()

{

	//freopen("f.txt","r",stdin);

	scanf("%d%d%d",&n,&m,&k);

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

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

		{

			mp[i][j]=getchar();

			while(mp[i][j]=='\n' || mp[i][j]=='\0')mp[i][j]=getchar();

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

			{

				wx[mp[i][j]-'0']=i;

				wy[mp[i][j]-'0']=j;

			}

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

			{

				wx[0]=i;

				wy[0]=j;

			}	

		}

	int ans=0;

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

		ans+=bfs(wx[i],wy[i],wx[i+1],wy[i+1]);

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

	return 0;

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

#include<cstring>

#include<queue>

using namespace std;

int n,m,k,step[1010][1010],temp[1010][3];

char a[1010][1010];

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

bool vis[1010][1010];

typedef pair<int,int> P;

int bfs(int x,int y,int ex,int ey)

{

	memset(vis,true,sizeof(vis));

	memset(step,0,sizeof(step));

	queue <P> que;

	que.push(P(x,y));

	vis[x][y]=false;

	while(!que.empty())

	{

		P tmp=que.front();que.pop();

		int b=que.size();

		if(tmp.first==ex&&tmp.second==ey)

		  return step[tmp.first][tmp.second];

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

		{

			int tx=tmp.first+dx[i];

			int ty=tmp.second+dy[i];

			if(tx>0&&tx<=n&&ty>0&&ty<=m&&vis[tx][ty]==true&&a[tx][ty]!='X')

			{

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

				vis[tx][ty]=false;

				step[tx][ty]=step[tmp.first][tmp.second]+1;

			}

		}

	}

}

int main()

{

	ios::sync_with_stdio(false);

	cin>>n>>m>>k;

		int sx,sy;

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

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

		  {

			cin>>a[i][j];

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

			  sx=i,sy=j;

			//temp[0][0]=i;

			//temp[0][1]=j;

		  }

		a[sx][sy]='0';

		int tot=0,ans=0;

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

		{

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

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

			    if(a[j][l]=='0'+i)

			    {

			    	tot=bfs(sx,sy,j,l);

			    	sx=j,sy=l;

				}

			ans+=tot;

		}

		cout<<ans<<endl;

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.2043241070194204x):
#include "cstring"

#include "cstdio"

#include "queue"

using namespace std;



const int maxn=1024;



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

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



char mp[maxn][maxn];

int vis[maxn][maxn];

int wx[10],wy[10];

int n,m,k;



int bfs(int x1,int y1,int x2,int y2)

{

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

	queue<int>qx;qx.push(x1);

	queue<int>qy;qy.push(y1);

	queue<int>qt;qt.push(0);

	vis[x1][y1]=1;

	

	while(!qx.empty())

	{

		int nx=qx.front();qx.pop();

		int ny=qy.front();qy.pop();

		int nt=qt.front();qt.pop();

		

		if(nx==x2 && ny==y2)return nt;

		

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

		{

			int px=nx+dx[i];

			int py=ny+dy[i];

			if(px>=0 && py>=0 && px<n && py<m && mp[px][py]!='X' && !vis[px][py])

			{

				qx.push(px);

				qy.push(py);

				qt.push(nt+1);

				vis[px][py]=1;

			}

		}

		

	}

	

	return 0;

}



int main()

{

	//freopen("f.txt","r",stdin);

	scanf("%d%d%d",&n,&m,&k);

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

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

		{

			mp[i][j]=getchar();

			while(mp[i][j]=='\n' || mp[i][j]=='\0')mp[i][j]=getchar();

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

			{

				wx[mp[i][j]-'0']=i;

				wy[mp[i][j]-'0']=j;

			}

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

			{

				wx[0]=i;

				wy[0]=j;

			}	

		}

	int ans=0;

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

		ans+=bfs(wx[i],wy[i],wx[i+1],wy[i+1]);

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

	return 0;

}
// Slower C++ solution:
//

//  AOJ 0558 Chees

//

//  Created by TaoSama on 2015-02-20

//  Copyright (c) 2014 TaoSama. All rights reserved.

//

#include <algorithm>

#include <cctype>

#include <cmath>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <iomanip>

#include <iostream>

#include <map>

#include <queue>

#include <string>

#include <set>

#include <vector>

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



using namespace std;

const int INF = 0x3f3f3f3f;

const int MOD = 1e9 + 7;

const int N = 1e5 + 10;



struct Point {

	int x, y;

	Point(int x = 0, int y = 0): x(x), y(y) {}

} c[15];

int n, m, k, dp[1005][1005];

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

char a[1005][1005];



int bfs(int x) {

	memset(dp, 0x3f, sizeof dp);

	queue <Point> q; q.push(c[x - 1]);

	dp[c[x - 1].x][c[x - 1].y] = 0;

	while(!q.empty()) {

		Point cur = q.front(); q.pop();

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

			Point nxt(cur.x + d[i][0], cur.y + d[i][1]);

			if(nxt.x < 1 || nxt.x > n || nxt.y < 1 || nxt.y > m

			        || a[nxt.x][nxt.y] == 'X') continue;

			if(dp[nxt.x][nxt.y] == INF) {

				dp[nxt.x][nxt.y] = dp[cur.x][cur.y] + 1;

				q.push(nxt);

			}

		}

	}

	return dp[c[x].x][c[x].y];

}

int main() {

#ifdef LOCAL

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

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

#endif

	ios_base::sync_with_stdio(0);



	while(cin >> n >> m >> k) {

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

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

				cin >> a[i][j];

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

					c[0].x = i, c[0].y = j;

				if(isdigit(a[i][j]))

					c[a[i][j] - '0'].x = i, c[a[i][j] - '0'].y = j;

			}

		}

		int ans = 0;

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

			ans += bfs(i);

		cout << ans << endl;

	}

	return 0;

}

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

#include<queue>

#include<algorithm>

using namespace std;



typedef pair<int,int> P;



const int inf=10000;

const int maxh=1010;

const int maxw=1010;

const int maxn=9;



int h,w,n;

int d[maxh][maxw];

char m[maxh][maxw];



int bx,by;

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

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



int bfs(char c){

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

		fill(d[i],d[i]+w,inf);

	}

	d[bx][by]=0;

	queue<P> que;

	que.push(P(bx,by));

	while(!que.empty()){

		P p=que.front();

		que.pop();

		if(m[p.first][p.second]==c){

			bx=p.first,by=p.second;

			break;

		}

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

			int nx=p.first+dx[i];

			int ny=p.second+dy[i];

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

				que.push(P(nx,ny));

				d[nx][ny]=d[p.first][p.second]+1;

			}

		}

	}

	return d[bx][by];

}



void solve(){

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

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

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

				bx=i,by=j;

				break;

			}

		}

	}

	int ans=0;

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

		ans+=bfs('0'+i);

	}

	cout<<ans<<endl;

}



int main(){

	while(cin>>h>>w>>n){

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

			cin>>m[i];

		}

		solve();

	}

	return 0;

}
// Slower C++ solution:
#include"stdio.h"

#include"stdlib.h"

#include"string.h"

#include"algorithm"

#include"queue"

using namespace std;

struct mmm

{

	int x,y;

}vv;

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

char xx[1005][1005];

int bb[11][2];

queue <mmm> qq;

int vis[1005][1005];

int bfs(char t)

{

	int sum = 0;

	int pl = 0;

	while(!qq.empty())

	{

		vv = qq.front();

		int x0 = vv.x;

		int y0 = vv.y;

		//printf("%d %d %d\n",x0,y0,vis[x0][y0]);

		qq.pop();

		if(xx[x0][y0] == t && !pl)

		{

			sum = vis[x0][y0];

			pl = 1;

		}

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

		{

			int xt = x0 + dir[i][0];

			int yt = y0 + dir[i][1];

			if(xx[xt][yt] != '#' && xx[xt][yt] != 'X' && vis[xt][yt] == -1)

			{

				vis[xt][yt] = vis[x0][y0] + 1;

				vv.x = xt;

				vv.y = yt;

				qq.push(vv);

			}

		}

	}

	return sum;

}

int main()

{

	int a,b,c,d,x1,y1,sum;

	while(~scanf("%d %d %d",&a,&b,&c))

	{

	//	if(a == 0 && b == 0)

	//	break;

		memset(xx,'#',sizeof(xx));

		getchar();

		for(int i = 1;i <= a;i++)

		{

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

			{

				xx[i][j] = getchar();

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

				{

					x1 = i;

					y1 = j;

				}

				else if(xx[i][j] != 'X')

				{

					bb[xx[i][j] - '0'][0] = i;

					bb[xx[i][j] - '0'][1] = j;

				}

			}

			getchar();

		}

		bb[0][0] = x1;

		bb[0][1] = y1;

		sum = 0;

		for(int i = 1;i <= c;i++)

		{

			vv.x = bb[i-1][0];

			vv.y = bb[i-1][1];

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

			vis[vv.x][vv.y] = 0;

			qq.push(vv);

			sum += bfs(i + '0');

		}

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

	}

	return 0;

}

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

#include<queue>

#include<algorithm>

using namespace std;



typedef pair<int,int> P;



const int inf=10000;

const int maxh=1010;

const int maxw=1010;

const int maxn=9;



int h,w,n;

int d[maxh][maxw];

char m[maxh][maxw];



int bx,by;

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

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



int bfs(char c){

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

		fill(d[i],d[i]+w,inf);

	}

	d[bx][by]=0;

	queue<P> que;

	que.push(P(bx,by));

	while(!que.empty()){

		P p=que.front();

		que.pop();

		if(m[p.first][p.second]==c){

			bx=p.first,by=p.second;

			break;

		}

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

			int nx=p.first+dx[i];

			int ny=p.second+dy[i];

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

				que.push(P(nx,ny));

				d[nx][ny]=d[p.first][p.second]+1;

			}

		}

	}

	return d[bx][by];

}



void solve(){

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

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

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

				bx=i,by=j;

				break;

			}

		}

	}

	int ans=0;

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

		ans+=bfs('0'+i);

	}

	cout<<ans<<endl;

}



int main(){

	while(cin>>h>>w>>n){

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

			cin>>m[i];

		}

		solve();

	}

	return 0;

}
// Slower C++ solution:
/************************************************

* Author        :somniloquy

* Created Time  :2015/10/30 16:15:09

 ************************************************/



#include <cstdio>

#include <algorithm>

#include <iostream>

#include <cstring>

#include <queue>



using namespace std;



const int hw_max = 1000 + 5;

char graph[hw_max][hw_max];

int sign[hw_max][hw_max];

int h, w, n, ans;

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

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

struct node

{

	int x;

	int y;

	int time;

} start;



void BFS(node op, char ed)

{

	queue <node> process;

	process.push(op);

	sign[op.x][op.y] = 1;

	while(!process.empty())

	{

		node now = process.front();

		process.pop();

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

		{

			node next = now;

			next.x += dx[i];

			next.y += dy[i];

			next.time ++;

			if(next.x >= 0 && next.x < h && next.y >= 0 && next.y < w && graph[next.x][next.y] != 'X' && !sign[next.x][next.y])

			{

				if(graph[next.x][next.y] == ed)

				{

					ans += next.time;

					next.time = 0;

					start = next;

				       	return;

				}

				else

				{

					process.push(next);

					sign[next.x][next.y] = 1;

				}

			}

		}

	}

}



int main()

{

	while(~scanf("%d %d %d", & h, & w, & n))

	{

		getchar();

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

		{

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

			{

			       scanf("%c", & graph[i][j]);

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

			       {

					start.x = i;

					start.y = j;

					start.time = 0;

			       }

			}

			getchar();

		}

		ans = 0;

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

		{

			memset(sign, 0, sizeof(sign));

			BFS(start, '0' + i);

		}

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

	}

	return 0;

}

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

#include<queue>

#include<algorithm>

using namespace std;



typedef pair<int,int> P;



const int inf=10000;

const int maxh=1010;

const int maxw=1010;

const int maxn=9;



int h,w,n;

int d[maxh][maxw];

char m[maxh][maxw];



int bx,by;

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

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



int bfs(char c){

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

		fill(d[i],d[i]+w,inf);

	}

	d[bx][by]=0;

	queue<P> que;

	que.push(P(bx,by));

	while(!que.empty()){

		P p=que.front();

		que.pop();

		if(m[p.first][p.second]==c){

			bx=p.first,by=p.second;

			break;

		}

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

			int nx=p.first+dx[i];

			int ny=p.second+dy[i];

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

				que.push(P(nx,ny));

				d[nx][ny]=d[p.first][p.second]+1;

			}

		}

	}

	return d[bx][by];

}



void solve(){

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

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

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

				bx=i,by=j;

				break;

			}

		}

	}

	int ans=0;

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

		ans+=bfs('0'+i);

	}

	cout<<ans<<endl;

}



int main(){

	while(cin>>h>>w>>n){

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

			cin>>m[i];

		}

		solve();

	}

	return 0;

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

#include <cmath>

#include <queue>

#include <cstdio>

#include <cstring>

#include <algorithm>



#define INF 0x7f7f7f7f

#define PI acos(-1.0)



#define L(x)    (x) << 1

#define R(x)    (x) << 1 | 1

#define lowbit(x)   (x)&(-x)

#define Mid(l, r)   (l + r) >> 1

#define Min(x, y)   (x) < (y) ? (x) : (y)

#define Max(x, y)   (x) < (y) ? (y) : (x)

#define iabs(x)     (x) < 0 ? -(x) : (x)

#define CLR(arr, val)    memset(arr, val, sizeof(arr))



using namespace std;



char map[1024][1024];

bool vis[1024][1024];

int cur, h, w;

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



struct node {

	int x, y, step;

} sta, now;



bool check(int x, int y) {

	if (x >= 0 && x < h && y >= 0 && y < w && !vis[x][y] && map[x][y] != 'X')	return true;

	return false;

}







void bfs(node s) {

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



	queue<node> que;

	s.step = 0;

	que.push(s);

	node next;

	while (!que.empty()) {

//		cout << "h\n";

		s = que.front();

//		cout << s.x << ' ' << s.y << ' ' << cur << endl;

		que.pop();

		if (map[s.x][s.y] == cur + '0')	{

			sta = s;

			return ;

//			s.step;

		}



//		cout << "a\n";

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

//			cout << i << endl;

			next.x = s.x + dir[i][0];

			next.y = s.y + dir[i][1];

			next.step = s.step + 1;

			if (check(next.x, next.y)) {

				vis[next.x][next.y] = true;

				que.push(next);

			}



		}

	}

}



int main() {

	int n;

	while (cin >> h >> w >> n) {

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

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

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

				cin >> map[i][j];

				if (map[i][j] == 'S')	sta.x = i, sta.y = j, map[i][j] = '.';

			}

		}

		sta.step = 0;

		int ans = 0;

		for (cur = 1; cur <= n; cur++) {

			bfs(sta);

			ans += sta.step;

			//cout << ans << endl;

		}

		cout << ans << endl;

	}

	return 0;

}

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

#include<queue>

#include<algorithm>

using namespace std;



typedef pair<int,int> P;



const int inf=10000;

const int maxh=1010;

const int maxw=1010;

const int maxn=9;



int h,w,n;

int d[maxh][maxw];

char m[maxh][maxw];



int bx,by;

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

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



int bfs(char c){

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

		fill(d[i],d[i]+w,inf);

	}

	d[bx][by]=0;

	queue<P> que;

	que.push(P(bx,by));

	while(!que.empty()){

		P p=que.front();

		que.pop();

		if(m[p.first][p.second]==c){

			bx=p.first,by=p.second;

			break;

		}

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

			int nx=p.first+dx[i];

			int ny=p.second+dy[i];

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

				que.push(P(nx,ny));

				d[nx][ny]=d[p.first][p.second]+1;

			}

		}

	}

	return d[bx][by];

}



void solve(){

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

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

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

				bx=i,by=j;

				break;

			}

		}

	}

	int ans=0;

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

		ans+=bfs('0'+i);

	}

	cout<<ans<<endl;

}



int main(){

	while(cin>>h>>w>>n){

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

			cin>>m[i];

		}

		solve();

	}

	return 0;

}