#include using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int H,W,M; cin >> H >> W >> M; vector S(H); for(auto &s : S) cin >> s; vector>> dist(H,vector>(W,vector(M+1,-1))); int sx,sy,gx,gy; for(int i=0; i> Q; Q.push({sx,sy,0}); dist.at(sx).at(sy).at(0) = 0; vector> dxy = {{-1,0},{0,1},{1,0},{0,-1}}; while(Q.size()){ auto [x,y,m] = Q.front(); Q.pop(); int d = dist.at(x).at(y).at(m); if('1' <= S.at(x).at(y) && S.at(x).at(y) <= '9'){ int v = S.at(x).at(y)-'0'; if(v != m){ if(dist.at(x).at(y).at(v) != -1) continue; dist.at(x).at(y).at(v) = d,Q.push({x,y,v}); continue; } } for(auto [dx,dy] : dxy){ int nx = x+dx,ny = y+dy; if(nx < 0 || ny < 0 || nx >= H || ny >= W) continue; if(S.at(nx).at(ny) == '#') continue; if(dist.at(nx).at(ny).at(m) != -1) continue; if('a' <= S.at(nx).at(ny) && S.at(nx).at(ny) <= 'i'){ if(S.at(nx).at(ny)-'a'+1 != m) continue; } dist.at(nx).at(ny).at(m) = d+1,Q.push({nx,ny,m}); } } int answer = 1000000; for(auto d : dist.at(gx).at(gy)) if(d != -1) answer = min(answer,d); if(answer == 1000000) answer = -1; cout << answer << endl; }