func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 50 + 5;   int R, C, K;   char g[maxn][maxn];   int sx, sy, tx, ty;   bool flag[300];   int mindist;   string ans;   const int dx[] = {0, 1, -1, 0};   const int dy[] = {1, 0, 0, -1};   bool mark[maxn][maxn];   int dist[maxn][maxn];   string board[maxn][maxn];   set<pair<int, int> > grid[maxn * maxn];   void calc() {     memset(dist, -1, sizeof dist);     memset(mark, false, sizeof mark);     queue<pair<int, int> > q;     dist[tx][ty] = 0;     board[tx][ty] =   ;     q.push(make_pair(tx, ty));     while (!q.empty()) {       int x = q.front().first;       int y = q.front().second;       q.pop();       for (int i = 0; i < 4; ++i) {         int xx = x + dx[i], yy = y + dy[i];         if (xx >= 0 && xx < R && yy >= 0 && yy < C &&             (flag[g[xx][yy]] || g[xx][yy] ==  S )) {           if (dist[xx][yy] == -1) {             dist[xx][yy] = dist[x][y] + 1;             q.push(make_pair(xx, yy));           }         }       }     }     if (dist[sx][sy] == -1) return;     string ret =   ;     int curd = dist[sx][sy];     grid[curd].clear();     grid[curd].insert(make_pair(sx, sy));     while (curd > 0) {       char best =  z  + 1;       for (set<pair<int, int> >::iterator it = grid[curd].begin();            it != grid[curd].end(); ++it) {         for (int i = 0; i < 4; ++i) {           int xx = it->first + dx[i], yy = it->second + dy[i];           if (xx >= 0 && xx < R && yy >= 0 && yy < C &&               dist[xx][yy] + 1 == curd) {             if (g[xx][yy] < best) {               best = g[xx][yy];               grid[curd - 1].clear();               grid[curd - 1].insert(make_pair(xx, yy));             } else if (best == g[xx][yy]) {               grid[curd - 1].insert(make_pair(xx, yy));             }           }         }       }       ret += best;       curd--;     }     ret = ret.substr(0, (int)ret.size() - 1);     if (mindist == -1 || dist[sx][sy] < mindist ||         dist[sx][sy] == mindist && ret < ans) {       ans = ret;       mindist = dist[sx][sy];     }   }   void dfs(int dep, int last) {     if (last == 26) {       if (dep == 0) {         calc();       }       return;     }     dfs(dep, last + 1);     if (dep > 0) {       flag[ a  + last] = 1;       dfs(dep - 1, last + 1);       flag[ a  + last] = 0;     }   }   int main() {     scanf( %d%d%d , &R, &C, &K);     for (int i = 0; i < R; ++i) {       scanf( %s , g[i]);     }     for (int i = 0; i < R; ++i) {       for (int j = 0; j < C; ++j) {         if (g[i][j] ==  S ) {           sx = i;           sy = j;         }         if (g[i][j] ==  T ) {           tx = i;           ty = j;         }       }     }     if (abs(sx - tx) + abs(tx - ty) == 1) {       puts(  );       return 0;     }     ans =   ;     mindist = -1;     memset(flag, 0, sizeof flag);     dfs(K, 0);     if (mindist == -1) {       printf( %d n , -1);     } else {       puts(ans.c_str());     }     return 0;   }   