#define _GLIBCXX_DEBUG #include #include using namespace std; using namespace atcoder; #define rep(i, n) for (int i = 0; i < (ll)(n); i++) #define all(a) (a).begin(), (a).end() using ll = long long; const int INF32 = 2e9; const ll INF64 = 4e18; const vector dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1}; void printYN(bool ok){ if(ok)cout << "Yes" << endl; else cout << "No" << endl; return; } struct iti { int i, j, k; }; int main() { int H, W, M; cin >> H >> W >> M; vector S(H); rep(i, H)cin >> S[i]; vector> G(M+1); rep(i, M+1){ G[i] = S; } int si, sj; rep(i, H)rep(j, W)if(G[0][i][j]=='S'){ si = i, sj = j; } queue q; iti st; st.i = 0; st.j = si; st.k = sj; q.push(st); vector>> dist(M+1, vector>(H, vector(W, INF32))); dist[0][si][sj] = 0; while(!q.empty()){ iti now = q.front(); q.pop(); rep(l, dx.size()){ int ni = now.i; int nj = now.j + dx[l], nk = now.k + dy[l]; if(nj<0||H<=nj||nk<0||W<=nk)continue; if(G[ni][nj][nk]=='#')continue; if(G[ni][nj][nk]>='a'&&G[ni][nj][nk]<'j'&&G[ni][nj][nk]!='a'+ni-1)continue; if(G[ni][nj][nk]>='1'&&G[ni][nj][nk]<='9'){ ni = G[ni][nj][nk] - '0'; if(dist[ni][nj][nk]!=INF32)continue; dist[ni][nj][nk] = dist[now.i][now.j][now.k]+1; iti next; next.i = ni; next.j = nj; next.k = nk; q.push(next); } else { if(dist[ni][nj][nk]!=INF32)continue; dist[ni][nj][nk] = dist[now.i][now.j][now.k]+1; iti next; next.i = ni; next.j = nj; next.k = nk; q.push(next); } } } int ans = INF32; rep(i, M+1)rep(j, H)rep(k, W)if(G[i][j][k]=='G')ans = min(dist[i][j][k], ans); if(ans!=INF32)cout << ans << endl; else cout << -1 << endl; return 0; }