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 <algorithm>
#include <cmath>
#include <climits>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map> //pair is also included in this library
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>

#define REP(i, s, n) for(int i = (int)(s); i < (int)(n); i++)
#define fst first
#define snd second
#define MP make_pair //incase c++11 or later is not available

using namespace std;

typedef long long int ll;
typedef vector<int> VI;
typedef vector<ll> VL;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;

//prefer define statement
//for reason that const int ver. of INF will raise a silly warning (unused variable)
#define INF (INT_MAX/3)
#define LIM_INF (INT_MAX)
//const int INF = INT_MAX/3;

/*------------------------------------------------------------------------------*/

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

PII s;

int bfs(vector<vector<char> > f, int H, int W, int n, PII sp){
  int res = 0;
  vector<VI > cost(H, VI(W, INF));
  int ini_y = sp.fst, ini_x = sp.snd;
  cost[ini_y][ini_x] = 0;

  queue<pair<PII, int> > q;
  q.push(MP(MP(ini_y, ini_x), 0));

  while(!q.empty()){
    pair<PII, int> p = q.front();
    q.pop();
    int y = p.fst.fst, x = p.fst.snd, c = p.snd;
    if(f[y][x] == (char)('0' + n)){
      res = c;
      s.fst = y;
      s.snd = x;
      break;
    } else {
      REP(i, 0, 4){
        int ny = y + my[i], nx = x + mx[i];
        if(ny >= 0 && ny < H && nx >= 0 && nx < W &&
           f[ny][nx] != 'X' && cost[ny][nx] > c + 1){
          cost[ny][nx] = c + 1;
          q.push(MP(MP(ny,nx), c + 1));
        }
      }
    }
  }

  return res;
}

int solve(vector<vector<char> > f, int H, int W, int N, PII p){
  int ans = 0;
  s = p;

  REP(i, 1, N+1){
    ans += bfs(f, H, W, i, s);
  }
  return ans;
}

int main(){
  int H, W, N;
  cin >> H >> W >> N;

  vector<vector<char> > f(H, vector<char>(W));
  int y, x;
  REP(i, 0, H){
    REP(j, 0, W){
      cin >> f[i][j];
      if(f[i][j] == 'S'){
        y = i;
        x = j;
      }
    }
  }

  cout << solve(f, H, W, N, MP(y, x)) << endl;
  return 0;
}

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){
						f[i1][i2] = 1;
					}
					else if (i2 == 0 || i2 == k + 1){
						f[i1][i2] = 1;
					}
					else
						f[i1][i2] = -1;
				}
			}

        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++: #include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
class road {
public:
	char thatlevel;
	char information;
	int time;
	road() :thatlevel('0'), information('X') {

	}
};
int main() {
	int H, W, N;
	queue<pair<short, short> > date;
	cin >> H >> W >> N;
	vector<vector<road> > map(W + 2, vector<road>(H + 2));
	for (int y = 1; y <= H; ++y) {
		for (int x = 1; x <= W; ++x) {
			cin >> map[x][y].information;
			if (map[x][y].information == 'S') {
				date.push(pair<short, short>(x, y));
				map[x][y].time = 0;
			}
		}
	}
	int answer = -1;
	short x, y;
	pair<short, short> dummy;
	char nlevel = '1';
	char movex[]{ 0,1,0,-1 }, movey[]{ 1,0,-1,0 };
	road *floor;
	while (answer < 0) {
		dummy = date.front();
		date.pop();
		x = dummy.first;
		y = dummy.second;
		for (int i = 0; i < 4; ++i) {
			floor = &map[x + movex[i]][y + movey[i]];
			if (floor->information == 'X')continue;
			if (floor->thatlevel < nlevel) {
				floor->thatlevel = nlevel;
				floor->time = map[x][y].time + 1;
				if (nlevel==floor->information) {
					++nlevel;
					floor->information = '.';
					if (nlevel == N + 1 + '0') {
						answer = floor->time;
					}
					queue<pair<short, short> > empty;
					swap(date, empty);
					date.push(pair<short, short>(x + movex[i], y + movey[i]));
					break;
				}
				date.push(pair<short, short>(x + movex[i], y + movey[i]));
			}
		}
	}
	cout << answer << endl;
	return 0;
}