#include using namespace std; void fast_io() { ios::sync_with_stdio(false); std::cin.tie(nullptr); } int main() { fast_io(); int h, w, m; cin >> h >> w >> m; vector s(h); for (int i = 0; i < h; i++) { cin >> s[i]; } const int INF = 1e9; vector dist(h, vector(w, vector(m + 1, INF))); deque> dq; int gi = -1, gj = -1; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (s[i][j] == 'S') { dist[i][j][0] = 0; dq.emplace_back(i, j, 0); } else if (s[i][j] == 'G') { gi = i; gj = j; } } } int di[] = {1, -1, 0, 0}; int dj[] = {0, 0, 1, -1}; auto is_in = [&](int i, int j) { return i >= 0 && i < h && j >= 0 && j < w; }; while (!dq.empty()) { auto [i, j, key] = dq.front(); dq.pop_front(); for (int d = 0; d < 4; d++) { int ni = i + di[d]; int nj = j + dj[d]; if (!is_in(ni, nj) || s[ni][nj] == '#') continue; if ('1' <= s[ni][nj] && s[ni][nj] <= '9') { int nkey = s[ni][nj] - '0'; if (dist[ni][nj][nkey] > dist[i][j][key] + 1) { dist[ni][nj][nkey] = dist[i][j][key] + 1; dq.emplace_back(ni, nj, nkey); } } else if ('a' <= s[ni][nj] && s[ni][nj] <= 'z') { if ('a' + key - 1 == s[ni][nj]) { if (dist[ni][nj][key] > dist[i][j][key] + 1) { dist[ni][nj][key] = dist[i][j][key] + 1; dq.emplace_back(ni, nj, key); } } } else { if (dist[ni][nj][key] > dist[i][j][key] + 1) { dist[ni][nj][key] = dist[i][j][key] + 1; dq.emplace_back(ni, nj, key); } } } } int ans = INF; for (int k = 0; k <= m; k++) { ans = min(ans, dist[gi][gj][k]); } if (ans == INF) { cout << -1 << endl; } else { cout << ans << endl; } }