func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 16, K = 225;   struct HASH {     size_t operator()(const pair<long long, long long> &x) const {       return hash<long long>()((x.first) ^ ((x.second) << 32));     }   };   int dx[4] = {0, 0, -1, 1}, dy[4] = {1, -1, 0, 0};   int n, m;   int len = 0;   long long pw[N];   string str[N];   unordered_map<pair<long long, long long>, int, HASH> dis;   bool good(pair<long long, long long> p, int i, int j) {     int cur = (i * m + j);     for (int k = 0; k < len - 1 - 5; k++)       if (p.first / pw[k] % K == cur) return false;     for (int k = 0; k < min(len - 1, 5); k++)       if (p.second / pw[k] % K == cur) return false;     return true;   }   bool in_bound(int i, int j) {     return i >= 0 && i < n && j >= 0 && j < m && str[i][j] !=  # ;   }   pair<long long, long long> getnxt(pair<long long, long long> p, int i, int j) {     p.first *= K;     p.first += p.second / pw[4];     p.first %= pw[max(len - 5, 0)];     p.second *= K;     p.second += (i * m + j);     p.second %= pw[min(len, 5)];     return p;   }   int main() {     pw[0] = 1;     for (int i = 1; i < 6; i++) pw[i] = pw[i - 1] * K;     cin >> n >> m;     for (int i = 0; i < n; i++) cin >> str[i];     pair<long long, long long> ori;     queue<pair<long long, long long> > que;     for (int i = 0; i < n; i++) {       for (int j = 0; j < m; j++) {         char c = str[i][j];         if (c >=  1  && c <=  9 ) {           int x = c -  0 ;           len = max(len, x);           x--;           if (x >= 5)             ori.first += (i * m + j) * pw[x - 5];           else             ori.second += (i * m + j) * pw[x];         }       }     }     que.push(ori);     dis[ori] = 0;     while (!que.empty()) {       pair<long long, long long> p = que.front();       que.pop();       int curdis = dis[p];       int ci = (int)(p.second % K / m), cj = (int)(p.second % K % m);       for (int d = 0; d < 4; d++) {         int ni = ci + dx[d], nj = cj + dy[d];         if (in_bound(ni, nj) && good(p, ni, nj)) {           if (str[ni][nj] ==  @ ) {             return cout << curdis + 1 << endl, 0;           }           pair<long long, long long> nxt = getnxt(p, ni, nj);           if (!dis.count(nxt)) {             que.push(nxt);             dis[nxt] = curdis + 1;           }         }       }     }     cout <<  -1  << endl;   }   