func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 1e9 + 7;   const double eps = 1e-10;   const double pi = acos(-1.0);   const int maxn = 1e6 + 10;   const long long inf = 0x3f3f3f3f;   const int dir[8][2] = {{0, 1}, {1, 0},  {0, -1}, {-1, 0},                          {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};   int n, m;   int dis[1010][1010][4];   char g[1010][1010];   queue<pair<int, int> > q;   void bfs(int x) {     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++)         if (g[i][j] ==  0  + x) q.push(make_pair(i, j)), dis[i][j][x] = 0;     while (!q.empty()) {       pair<int, int> p = q.front();       q.pop();       for (int i = 0; i < 4; i++) {         int dx = p.first + dir[i][0];         int dy = p.second + dir[i][1];         if (dx < 1 || dx > n || dy < 1 || dy > m || g[dx][dy] ==  # ) continue;         int v = (g[dx][dy] ==  . );         if (dis[p.first][p.second][x] + v < dis[dx][dy][x]) {           dis[dx][dy][x] = dis[p.first][p.second][x] + v;           q.push(make_pair(dx, dy));         }       }     }   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> n >> m;     for (int i = 1; i <= n; i++) cin >> g[i] + 1;     memset(dis, inf, sizeof dis);     bfs(1), bfs(2), bfs(3);     long long ans = inf;     for (int i = 1; i <= n; i++)       for (int j = 1; j <= m; j++) {         long long tmp = 0;         for (int k = 1; k <= 3; k++) tmp += dis[i][j][k];         if (g[i][j] ==  . ) tmp -= 2;         ans = min(ans, tmp);       }     if (ans == inf)       cout << -1;     else       cout << ans;     return 0;   }   