Title:

There are three countries. They want to communicate with each other. They want to communicate with each other. They want to communicate with each other

There is a matrix of n*m, ාstands for the wall, which means there is a matrix of n*m that can't walk, \ #stands for the wall, which means there is a matrix of n*m that can't walk, ාstands for the wall, which means there is no walk

1, 2, 3 for countries, 1, 2, 3 for countries, 1, 2, 3 for countries, and 1, 2, 3 for countries

. for roads that can be opened, it costs 1. For roads that can be opened, it costs 1. For roads that can be opened, it costs 1

What's the minimum cost? What's the minimum cost? What's the minimum cost? What's the minimum cost? What's the minimum cost

Explanation:

The best way for three countries to connect with each other must be at one point. The best way for three countries to connect with each other must be at one point

Then just look at the minimum cost of three countries to the same point. Then just look at the minimum cost of three countries to the same point. Only look at the minimum cost of three countries to the same point

Because every country is a connected block, the first thing to find the minimum cost is BFS. Because every country is a connected block, the first thing to find the minimum cost is BFS. Because every country is a connected block, the first thing to find the minimum cost is BFS

Then we can consider two methods of BFS, then we can consider two methods of BFS, then we can consider two methods of BFS

The first is to stop from BFS at each point and three countries. The first is to stop from BFS at each point and three countries. The first is to stop from BFS at each point and three countries

Find the sum of these values

But obviously, this will tle, because the complexity of enumeration point is O(nm), but obviously, this will tle, because the complexity of enumeration point is O(nm), but obviously, this will tle, because the complexity of enumeration point is O(nm)

The complexity of BFS is O(nm), which eventually becomes O(n2m2) the complexity of BFS is O(nm), which finally becomes o (n ^ 2m ^ 2) the complexity of BFS is O(nm), which finally becomes O(n2m2)

Consider the second. Consider the second. Consider the second

Start BFS from each country, then find the minimum value from three countries to a point, start BFS from each country, then find the minimum value from three countries to a point, start BFS from each country, then find the minimum value from three countries to a point

BFS complexity is O(nm), three countries BFS three times, can guarantee time BFS complexity is O(nm), three countries BFS three times, can guarantee time BFS complexity is O(nm), three countries BFS three times, can guarantee time

At last, as long as the minimum value of enumeration point sum is available, as long as the minimum value of enumeration point sum is available, as long as the minimum value of enumeration point sum is available

However, if the current point is not a country, two countries will build roads at that point repeatedly. If the current point is not a country, two countries will build roads at that point repeatedly. If the current point is not a country, two countries will build roads at that point repeatedly

So we need to subtract two expenses, so we need to subtract two expenses, so we need to subtract two expenses

AC code

/* Author:zzugzx Lang:C++ Blog:blog.csdn.net/qq_43756519 */ #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define endl '\n' #define SZ(x) (int)x.size() typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int mod=1e9+7; //const int mod=998244353; const double eps = 1e-10; const double pi=acos(-1.0); const int maxn=1e6+10; const ll 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<pii> 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(mp(i,j)),dis[i][j][x]=0; while(!q.empty()){ pii p=q.front(); q.pop(); for(int i=0;i<4;i++){ int dx=p.fi+dir[i][0]; int dy=p.se+dir[i][1]; if(dx<1||dx>n||dy<1||dy>m||g[dx][dy]=='#')continue; int v=(g[dx][dy]=='.'); if(dis[p.fi][p.se][x]+v<dis[dx][dy][x]){ dis[dx][dy][x]=dis[p.fi][p.se][x]+v; q.push(mp(dx,dy)); } } } } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); 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); ll ans=inf; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ ll 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; }