h,w,n = list(map(int, input().split()))

stage = [eval(input()) for i in range(h)]

starts = [str(i) for i in range(n)]

goals = [str(i+1) for i in range(n)]

starts_y = [0 for i in range(n)]

starts_x = [0 for i in range(n)]

goals_y = [0 for i in range(n)]

goals_x = [0 for i in range(n)]



starts[0] = "S"

for y in range(h):

	for x in range(w):

		if stage[y][x] in starts:

			starts_y[starts.index(stage[y][x])] = y

			starts_x[starts.index(stage[y][x])] = x

		if stage[y][x] in goals:

			goals_y[goals.index(stage[y][x])] = y

			goals_x[goals.index(stage[y][x])] = x





sum = 0



for start_y, start_x, goal_y, goal_x in zip(starts_y, starts_x, goals_y, goals_x):

	bfs_map = [[-1 for j in range(w)] for i in range(h)]

	data_y = [start_y]

	data_x = [start_x]

	bfs_map[start_y][start_x] = 0

	goal = False

	

	while (data_y) and not goal:

		y = data_y.pop(0)

		x = data_x.pop(0)

		goal = False

	

		for i in range(4):

			ny = y + [0,1,0,-1][i]

			nx = x + [1,0,-1,0][i]

			

			if ny >= 0 and ny < h and nx >= 0 and nx < w:

				if bfs_map[ny][nx] == -1 and stage[ny][nx] != "X":

					bfs_map[ny][nx] = bfs_map[y][x]+1

					data_y.append(ny)

					data_x.append(nx)

			if bfs_map[goal_y][goal_x] != -1:

				sum += bfs_map[goal_y][goal_x]

				goal = True

				break



print(sum)

#import time, sys#

from collections import deque



H, W, N = list(map(int, input().split()))

field = [list(eval(input())) for i in range(H)]

'''

20 30 9

.......X..8.XXXX.XX..XX.X.XX..

X.XX....X.XX..X.X.X....XXXX..X

..X.X..XX..X.....XX.X..X.XX...

....X.X.X.XXX.X..X..X.X..XX.X.

..XXX.XX...X.X....X.X..X..X...

..X...........X.X...X.1.XX...X

.X.X....X..XX..XX......9.X...4

..X....X........X......X......

....XXX.X...XX.X.....X.X..X.X.

..S..XXX..X....X.X.......X..X.

.5...XX..X.X..X....X...XXX....

..X...X.X....X....X..X.2X.....

XXXXXXXX.X.XX..XX..XX.......X.

.....X...........3..XX.XXX.X.X

..X.....X..X..XX.XX..X.X...XX.

...X..X.XXX.XX......X...X..XXX

.X.XX.X.........X.X...X...X..X

..X...X..X..XX..XXX..X.XX...X.

X....X.X....X...X.X..XX.XX..X.

...X6X..X........X.X.....7.X..

'''



#input = input().split('\n')#

#H, W, N = map(int, input.pop(0).split())#

#field = [line for line in input]#

node_posi = [0 for i in range(N+1)]



#s1 = time.time()#

nodes = 'S123456789'

for i in range(H):

	for j in range(W):

		if field[i][j] in nodes:

			node_posi[nodes.index(field[i][j])] = [j, i]

#e1 = time.time()#

#print("b:{}".format(e1-s1))#



cost = 0

#count = 1#

for i in range(len(node_posi)-1):

	#s2 = time.time()#

	searched = [[-1]*W for i in range(H)]

	start, goal = node_posi[i], node_posi[i+1]

	Q = deque([start])

	searched[start[1]][start[0]] = 0

	goal_flag = False

	

	while Q and not goal_flag:

		x, y = Q.popleft()

		goal_flag = False



		for q in range(4):

			nx = x + [1,0,-1,0][q]

			ny = y + [0,1,0,-1][q]

			

			if nx >= 0 and nx < W and ny >= 0 and ny < H:

				if searched[ny][nx] == -1 and field[ny][nx] != 'X':

					Q.append([nx, ny])

					searched[ny][nx] = searched[y][x] + 1

					if ([nx, ny] == goal):

						cost += searched[ny][nx]

						goal_flag = True

						break



			#s = "\n".join(["".join(map(lambda x: str(x)[:1], j)) for j in searched])#

			#sys.stdout.write("\r{}".format(s))#

			#sys.stdout.flush()#

	

	#e2 = time.time()#

	#print("{}:{}".format(count, e2-s2))#

	#count += 1#

print(cost)

h, w, n = list(map(int, input().split()))
stage = [eval(input()) for i in range(h)]
starts = [str(i) for i in range(n)]
goals = [str(i + 1) for i in range(n)]
starts_y = [0 for i in range(n)]
starts_x = [0 for i in range(n)]
goals_y = [0 for i in range(n)]
goals_x = [0 for i in range(n)]
starts[0] = "S"
for y in range(h):
    for x in range(w):
        if stage[y][x] in starts:
            starts_y[starts.index(stage[y][x])] = y
            starts_x[starts.index(stage[y][x])] = x
        if stage[y][x] in goals:
            goals_y[goals.index(stage[y][x])] = y
            goals_x[goals.index(stage[y][x])] = x
sum = 0
for start_y, start_x, goal_y, goal_x in zip(starts_y, starts_x, goals_y, goals_x):
    bfs_map = [[-1 for j in range(w)] for i in range(h)]
    data_y = [start_y]
    data_x = [start_x]
    bfs_map[start_y][start_x] = 0
    goal = False
    while (data_y) and not goal:
        y = data_y.pop(0)
        x = data_x.pop(0)
        goal = False
        for i in range(4):
            ny = y + [0, 1, 0, -1][i]
            nx = x + [1, 0, -1, 0][i]
            if ny >= 0 and ny < h and nx >= 0 and nx < w:
                if bfs_map[ny][nx] == -1 and stage[ny][nx] != "X":
                    bfs_map[ny][nx] = bfs_map[y][x] + 1
                    data_y.append(ny)
                    data_x.append(nx)
            if bfs_map[goal_y][goal_x] != -1:
                sum += bfs_map[goal_y][goal_x]
                goal = True
                break
print(sum)

# import time, sys#
from collections import deque

H, W, N = list(map(int, input().split()))
field = [list(eval(input())) for i in range(H)]
"""
20 30 9
.......X..8.XXXX.XX..XX.X.XX..
X.XX....X.XX..X.X.X....XXXX..X
..X.X..XX..X.....XX.X..X.XX...
....X.X.X.XXX.X..X..X.X..XX.X.
..XXX.XX...X.X....X.X..X..X...
..X...........X.X...X.1.XX...X
.X.X....X..XX..XX......9.X...4
..X....X........X......X......
....XXX.X...XX.X.....X.X..X.X.
..S..XXX..X....X.X.......X..X.
.5...XX..X.X..X....X...XXX....
..X...X.X....X....X..X.2X.....
XXXXXXXX.X.XX..XX..XX.......X.
.....X...........3..XX.XXX.X.X
..X.....X..X..XX.XX..X.X...XX.
...X..X.XXX.XX......X...X..XXX
.X.XX.X.........X.X...X...X..X
..X...X..X..XX..XXX..X.XX...X.
X....X.X....X...X.X..XX.XX..X.
...X6X..X........X.X.....7.X..
"""
# input = input().split('\n')#
# H, W, N = map(int, input.pop(0).split())#
# field = [line for line in input]#
node_posi = [0 for i in range(N + 1)]
# s1 = time.time()#
nodes = "S123456789"
for i in range(H):
    for j in range(W):
        if field[i][j] in nodes:
            node_posi[nodes.index(field[i][j])] = [j, i]
# e1 = time.time()#
# print("b:{}".format(e1-s1))#
cost = 0
# count = 1#
for i in range(len(node_posi) - 1):
    # s2 = time.time()#
    searched = [[-1] * W for i in range(H)]
    start, goal = node_posi[i], node_posi[i + 1]
    Q = deque([start])
    searched[start[1]][start[0]] = 0
    goal_flag = False
    while Q and not goal_flag:
        x, y = Q.popleft()
        goal_flag = False
        for q in range(4):
            nx = x + [1, 0, -1, 0][q]
            ny = y + [0, 1, 0, -1][q]
            if nx >= 0 and nx < W and ny >= 0 and ny < H:
                if searched[ny][nx] == -1 and field[ny][nx] != "X":
                    Q.append([nx, ny])
                    searched[ny][nx] = searched[y][x] + 1
                    if [nx, ny] == goal:
                        cost += searched[ny][nx]
                        goal_flag = True
                        break
            # s = "\n".join(["".join(map(lambda x: str(x)[:1], j)) for j in searched])#
            # sys.stdout.write("\r{}".format(s))#
            # sys.stdout.flush()#
    # e2 = time.time()#
    # print("{}:{}".format(count, e2-s2))#
    # count += 1#
print(cost)

-h, w, n = list(map(int, input().split())) -stage = [eval(input()) for i in range(h)] -starts = [str(i) for i in range(n)] -goals = [str(i + 1) for i in range(n)] -starts_y = [0 for i in range(n)] -starts_x = [0 for i in range(n)] -goals_y = [0 for i in range(n)] -goals_x = [0 for i in range(n)] -starts[0] = "S" -for y in range(h): -    for x in range(w): -        if stage[y][x] in starts: -            starts_y[starts.index(stage[y][x])] = y -            starts_x[starts.index(stage[y][x])] = x -        if stage[y][x] in goals: -            goals_y[goals.index(stage[y][x])] = y -            goals_x[goals.index(stage[y][x])] = x -sum = 0 -for start_y, start_x, goal_y, goal_x in zip(starts_y, starts_x, goals_y, goals_x): -    bfs_map = [[-1 for j in range(w)] for i in range(h)] -    data_y = [start_y] -    data_x = [start_x] -    bfs_map[start_y][start_x] = 0 -    goal = False -    while (data_y) and not goal: -        y = data_y.pop(0) -        x = data_x.pop(0) -        goal = False -        for i in range(4): -            ny = y + [0, 1, 0, -1][i] -            nx = x + [1, 0, -1, 0][i] -            if ny >= 0 and ny < h and nx >= 0 and nx < w: -                if bfs_map[ny][nx] == -1 and stage[ny][nx] != "X": -                    bfs_map[ny][nx] = bfs_map[y][x] + 1 -                    data_y.append(ny) -                    data_x.append(nx) -            if bfs_map[goal_y][goal_x] != -1: -                sum += bfs_map[goal_y][goal_x] -                goal = True -                break -print(sum) +# import time, sys# +from collections import deque + +H, W, N = list(map(int, input().split())) +field = [list(eval(input())) for i in range(H)] +""" +20 30 9 +.......X..8.XXXX.XX..XX.X.XX.. +X.XX....X.XX..X.X.X....XXXX..X +..X.X..XX..X.....XX.X..X.XX... +....X.X.X.XXX.X..X..X.X..XX.X. +..XXX.XX...X.X....X.X..X..X... +..X...........X.X...X.1.XX...X +.X.X....X..XX..XX......9.X...4 +..X....X........X......X...... +....XXX.X...XX.X.....X.X..X.X. +..S..XXX..X....X.X.......X..X. +.5...XX..X.X..X....X...XXX.... +..X...X.X....X....X..X.2X..... +XXXXXXXX.X.XX..XX..XX.......X. +.....X...........3..XX.XXX.X.X +..X.....X..X..XX.XX..X.X...XX. +...X..X.XXX.XX......X...X..XXX +.X.XX.X.........X.X...X...X..X +..X...X..X..XX..XXX..X.XX...X. +X....X.X....X...X.X..XX.XX..X. +...X6X..X........X.X.....7.X.. +""" +# input = input().split('\n')# +# H, W, N = map(int, input.pop(0).split())# +# field = [line for line in input]# +node_posi = [0 for i in range(N + 1)] +# s1 = time.time()# +nodes = "S123456789" +for i in range(H): +    for j in range(W): +        if field[i][j] in nodes: +            node_posi[nodes.index(field[i][j])] = [j, i] +# e1 = time.time()# +# print("b:{}".format(e1-s1))# +cost = 0 +# count = 1# +for i in range(len(node_posi) - 1): +    # s2 = time.time()# +    searched = [[-1] * W for i in range(H)] +    start, goal = node_posi[i], node_posi[i + 1] +    Q = deque([start]) +    searched[start[1]][start[0]] = 0 +    goal_flag = False +    while Q and not goal_flag: +        x, y = Q.popleft() +        goal_flag = False +        for q in range(4): +            nx = x + [1, 0, -1, 0][q] +            ny = y + [0, 1, 0, -1][q] +            if nx >= 0 and nx < W and ny >= 0 and ny < H: +                if searched[ny][nx] == -1 and field[ny][nx] != "X": +                    Q.append([nx, ny]) +                    searched[ny][nx] = searched[y][x] + 1 +                    if [nx, ny] == goal: +                        cost += searched[ny][nx] +                        goal_flag = True +                        break +            # s = "\n".join(["".join(map(lambda x: str(x)[:1], j)) for j in searched])# +            # sys.stdout.write("\r{}".format(s))# +            # sys.stdout.flush()# +    # e2 = time.time()# +    # print("{}:{}".format(count, e2-s2))# +    # count += 1# +print(cost)