Go: ///
// File:  0558.go
// Author: ymiyamoto
//
// Created on Sun Mar  4 20:58:45 2018
//
package main

import (
	"fmt"
	"strconv"
	"strings"
)

type pos struct {
	x, y int
}

var H, W, N int
var graph [][]string

func wfs(p pos, index int) (int, pos) {
	var q []pos
	dists := make([][]int, H)
	for i := range dists {
		dists[i] = make([]int, W)
	}

	q = append(q, p)
	for len(q) > 0 {
		p := q[0]
		dist := dists[p.x][p.y]
		q = q[1:]

		for _, d := range []pos{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} {
			x := p.x + d.x
			y := p.y + d.y
			if 0 <= x && x < H && 0 <= y && y < W && graph[x][y] != "X" && dists[x][y] == 0 {
				dists[x][y] = dist + 1
				q = append(q, pos{x, y})
			}
		}
	}

	for i := range graph {
		for j := range graph[i] {
			if graph[i][j] == strconv.Itoa(index) {
				return dists[i][j], pos{i, j}
			}
		}
	}

	panic("not found")
}

func main() {
	fmt.Scan(&H, &W, &N)

	var start pos

	graph = make([][]string, H)
	for i := range graph {
		var s string
		fmt.Scan(&s)
		graph[i] = strings.Split(s, "")
		for j := range graph[i] {
			if graph[i][j] == "S" {
				start.x = i
				start.y = j
			}
		}
	}

	count := 0
	for i := 1; i <= N; i++ {
		c, s := wfs(start, i)
		start = s
		count += c
	}

	fmt.Println(count)
}

C++: #include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
 
 
 
int main()
{
 
    queue < pair<int, int> > q;
    pair<int, int> p;
 
 
 
    char **m;
    char c[10] = { "123456789" };
    int **f;
	bool flg = false;
    int n, k, i, i1, c1, i2, sum = 0;
    cin >> n;
    cin >> k;
    cin >> c1;
 
    m = new char *[n + 2];
    f = new int *[n + 2];
 
    for (i = 0; i < n + 2; i++){
        m[i] = new char[k + 2];
        f[i] = new int[k + 2];
    }
 
    for (i = 1; i <= n; i++){
        for (i1 = 1; i1 <= k; i1++){
            cin >> m[i][i1];
        }
    }
 
    for (i = 0; i < n + 2; i++){
        for (i1 = 0; i1 < k + 2; i1++){
            if (i == 0 || i == n + 1){
                m[i][i1] = 'X';
            }
            else if (i1 == 0 || i1 == k + 1){
                m[i][i1] = 'X';
            }
        }
    }
 
    for (i = 1; i <= n; i++){
        for (i1 = 1; m[i][i1] != '\0'; i1++){
            if (m[i][i1] == 'S'){
                q.push(make_pair(i, i1));
            }
        }
    }
 
 
 
    pair<int, int> temp;
 
    temp = q.front();
 
    for (i = 0; i < c1; i++){

		for (i1 = 0; i1 < n + 2; i1++){
				for (i2 = 0; i2 < k + 2; i2++){
					if ((i1 == 0 || i1 == n + 1) && !flg){
						f[i1][i2] = 1;
					}
					else if ((i2 == 0 || i2 == k + 1) && !flg){
						f[i1][i2] = 1;
					}
					else
						f[i1][i2] = -1;
				}
		}
		flg = true;
		}

        f[temp.first][temp.second] = 0;
 
		while (!q.empty()){
            p = q.front();
            q.pop();
 
            int x[4] = { -1, 1, 0, 0 }, y[4] = { 0, 0, -1, 1 };
 
            for (int j = 0; j < 4; j++){
 
                //???????????´??????????´¢
                if (m[p.first + x[j]][p.second + y[j]] != 'X' && f[p.first + x[j]][p.second + y[j]] < 0){
                    q.push(make_pair(p.first + x[j], p.second + y[j]));
                    f[p.first + x[j]][p.second + y[j]] = f[p.first][p.second] + 1;
                }
            }
            //??´?????????????????????
            if (m[p.first][p.second] == c[i]){
                sum += f[p.first][p.second];
                temp = p;
                while (!q.empty()){
                    q.pop();
                }
                q.push(p);
                break;
			}
		}
	}
 
    cout << sum << endl;
 
    return 0;
}

C++: #pragma once

#include <stdio.h>
#include <string>
#include <iostream>
#include <queue>
using namespace std;
string S[1001];
long result=0;
int H,W,N;
long mintime[1000][1000];
queue<int> qx,qy,time;
int sx,sy,gx,gy;
int step = 0;
FILE *fp;

int main(){
	fp = fopen("answer.txt","w");
	scanf("%d%d%d",&H,&W,&N);

	for(int i=0;i<H;i++){
		cin>>S[i];
		for(int j=0;j<W;j++){
			mintime[i][j]=1000000;
			if(S[i][j]=='S'){
				sx=j;
				sy=i;
				qx.push(j);
				qy.push(i);
				time.push(0);
			}

			if(S[i][j]-'0'==N){
				gx=j;
				gy=i;
			}

		}
	}



for(int acc=0;acc<N;acc++){
	step++;
	while(step<=N){
		
		if(qx.front()>0){
		if(time.front()<mintime[qy.front()][qx.front()-1]-1  && S[qy.front()][qx.front()-1] !='X'){
			if(S[qy.front()][qx.front()-1]-'0' ==step){
			result += time.front()+1;
			sx=qx.front()-1;
			sy=qy.front();
			while(qx.empty()== false){
				qx.pop();
				qy.pop();
				time.pop();
			}
			
			qx.push(sx);
			qy.push(sy);
			time.push(0);
			break;
		}
				qx.push(qx.front()-1);
				qy.push(qy.front());
				time.push(time.front()+1);
				mintime[qy.front()][qx.front()-1]=time.front()+1;
		}

	}
		//

	if( qx.front()<W-1 ){
		if(time.front()<mintime[qy.front()][qx.front()+1]-1 && S[qy.front()][qx.front()+1] !='X'){

		if(S[qy.front()][qx.front()+1]-'0' ==step){
			result += time.front()+1;
			sx=qx.front()+1;
			sy=qy.front();
			while(qx.empty()== false){
				qx.pop();
				qy.pop();
				time.pop();
			}
			
			qx.push(sx);
			qy.push(sy);
			time.push(0);
			break;
		}

				qx.push(qx.front()+1);
				qy.push(qy.front());
				time.push(time.front()+1);
				mintime[qy.front()][qx.front()+1]=time.front()+1;
		}
	}

		//

	if( qy.front()>0){
		if(time.front()<mintime[qy.front()-1][qx.front()]-1  && S[qy.front()-1][qx.front()] !='X'){

			if(S[qy.front()-1][qx.front()]-'0' ==step){
			result += time.front()+1;
			sx=qx.front();
			sy=qy.front()-1;
			while(qx.empty()== false){
				qx.pop();
				qy.pop();
				time.pop();
			}
			
			qx.push(sx);
			qy.push(sy);
			time.push(0);
			break;
		}

				qx.push(qx.front());
				qy.push(qy.front()-1);
				time.push(time.front()+1);
				mintime[qy.front()-1][qx.front()]=time.front()+1;
		}
	}

		//

	if(qy.front()<H-1){
		if(time.front()<mintime[qy.front()+1][qx.front()]-1  && S[qy.front()+1][qx.front()] !='X'){

				if(S[qy.front()+1][qx.front()]-'0' ==step){
			result += time.front()+1;
			sx=qx.front();
			sy=qy.front()+1;
			while(qx.empty()== false){
				qx.pop();
				qy.pop();
				time.pop();
			}
			
			qx.push(sx);
			qy.push(sy);
			time.push(0);
			break;
		}

				qx.push(qx.front());
				qy.push(qy.front()+1);
				time.push(time.front()+1);
				mintime[qy.front()+1][qx.front()]=time.front()+1;
		}
	}


		qx.pop();
		qy.pop();
		time.pop();
	



	}

	for(int i=0;i<H;i++){
		for(int j=0;j<W;j++){
			mintime[i][j]=1000000;
		}
	}

}

printf("%d\n",result);
	fprintf(fp,"%d\n",result);
	fclose(fp);
return 0;

}

C++: #include<bits/stdc++.h>
using namespace std;
#define ff first.first
#define fs first.second
#define se second
int main(void)
{
	int h,w,n;
	char map[1001][1001];
	char map2[1001][1001];
	int xx,yy;
	int i,j,k,min,cnt,sx,sy;
	int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
	
	cin>>h>>w>>n;
	
	for(i=0;i<h;i++) cin>>map[i];
	
	for(i=0;i<h;i++){
		for(j=0;j<w;j++){
			if(map[i][j]=='S')
				sx=i,sy=j;
		}	
	}
	
	cnt=1,min=0;
	
	for(i=1;i<=n;i++){
	
		typedef pair<int,int>P;
		typedef pair<P,int>PP;
		queue<PP> que;
		
		for(j=0;j<h;j++)	strcpy(map2[j],map[j]);
		
		que.push(PP(P(sx,sy),0));
		
		while(!que.empty()){
				
			PP q=que.front(); 
				que.pop();

			if(map2[q.ff][q.fs]-'0'==i){
				min+=q.se;
				sx=q.ff,sy=q.fs;
				break;
			}	
			
			else{
				if(map2[q.ff][q.fs]!='X'){
					map2[q.ff][q.fs]='X';
					
					for(k=0;k<4;k++){
					
						xx=q.ff+dx[k];
						yy=q.fs+dy[k];
						
						if(map2[xx][yy]!='X'
							&&xx>=0&&yy>=0&&xx<h&&yy<w){
							que.push(PP(P(xx,yy),q.se+1));
						}	
					}
				}	
			}	
		}
	}	
	cout<<min<<endl;
	
	return 0;
}