func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<vector<set<int> > > setgrid;   vector<string> grid;   int k;   int ro[4] = {1, -1, 0, 0};   int co[4] = {0, 0, -1, 1};   struct s {     s() : r(-1), c(-1), set(-1), path(  ), let( A ), d(0) {}     s(int nr, int nc, unsigned int nset, string npath, char nlet, int nd)         : r(nr), c(nc), set(nset), path(npath), let(nlet), d(nd) {}     int r, c, d;     unsigned int set;     string path;     char let;   };   bool operator<(const s &lhs, const s &rhs) {     if (lhs.d == rhs.d)       if (lhs.path == rhs.path)         return lhs.let >= rhs.let;       else         return lhs.path >= rhs.path;     else       return lhs.d >= rhs.d;   }   bool visited(int r, int c, unsigned int set) {     unsigned int subset = set;     do {       subset = (subset - 1) & set;       if (setgrid[r][c].find(subset) != setgrid[r][c].end()) {         return true;       }     } while (subset != set);     return false;   }   int main(void) {     s qf;     int rs, cs, nr, nc;     unsigned int nset, one = 0x00000001;     priority_queue<s> q;     vector<s> pv, tv;     cin >> rs >> cs >> k;     grid.resize(rs);     for (int i = 0; i < rs; i++) cin >> grid[i];     setgrid.resize(rs);     for (int i = 0; i < rs; i++) setgrid[i].resize(cs);     int sr, sc;     for (int i = 0; i < rs; i++)       for (int j = 0; j < cs; j++)         if (grid[i][j] ==  S ) {           sr = i;           sc = j;           break;         }     q.push(s(sr, sc, 0,   ,  a , 0));     setgrid[sr][sc].insert(0);     while (!q.empty()) {       pv.clear();       qf = q.top();       for (int i = 0; i < 4; i++) {         nr = qf.r + ro[i];         nc = qf.c + co[i];         if (nr < 0 || nr >= rs || nc < 0 || nc >= cs) continue;         if (grid[nr][nc] ==  T ) goto success;         nset = qf.set | (one << int(grid[nr][nc] -  a ));         if ((__builtin_popcount(nset) > k) || visited(nr, nc, nset)) continue;         pv.push_back(             s(nr, nc, nset, qf.path + grid[nr][nc], grid[nr][nc], qf.d + 1));         setgrid[nr][nc].insert(nset);       }       sort(pv.begin(), pv.end());       for (int i = 0; i < pv.size(); i++) q.push(pv[i]);       q.pop();     }     cout << -1 <<   n ;     return 0;   success:     if (qf.path !=   ) cout << qf.path <<   n ;     return 0;   }   