#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=55;
int n,m,num,ans=1e9,f[20][100005];
int a[N][N],bel[N][N],visit[N][N],dis[20][20];
int dx[4]={0,0,1,-1},
dy[4]={1,-1,0,0};
vector<pair<int,int> >g[20];
inline void dfs(int x,int y){
bel[x][y]=num;g[num].push_back(pair<int,int>(x,y));
for(int i=0;i<4;++i){
int xx=x+dx[i],yy=y+dy[i];
if(a[xx][yy]!=2||bel[xx][yy])continue;
dfs(xx,yy);
}
}
int main(){
n=read();m=read();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
char ch;cin>>ch;
if(ch=='X')a[i][j]=2;
if(ch=='S')a[i][j]=1;
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(a[i][j]==2&&!bel[i][j])++num,dfs(i,j);
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=num;++i)dis[i][i]=0;
for(int i=1;i<=num;++i){
memset(visit,0x3f,sizeof(visit));
queue<pair<int,int> >q;
for(int j=0;j<(int)g[i].size();++j)q.push(g[i][j]),visit[g[i][j].first][g[i][j].second]=0;
while(q.size()){
int x=q.front().first,y=q.front().second;q.pop();
for(int j=0;j<4;++j){
int xx=x+dx[j],yy=y+dy[j];
if(!a[xx][yy]||bel[xx][yy]==i)continue;
if(a[xx][yy]==2){
dis[i][bel[xx][yy]]=min(dis[i][bel[xx][yy]],visit[x][y]);
if(visit[xx][yy]>visit[x][y]){
visit[xx][yy]=visit[x][y];
q.push(pair<int,int>(xx,yy));
}
}
if(a[xx][yy]==1){
if(visit[xx][yy]>visit[x][y]+1){
visit[xx][yy]=visit[x][y]+1;
q.push(pair<int,int>(xx,yy));
}
}
}
}
}
memset(f,0x3f,sizeof(f));
for(int i=1;i<=num;++i)f[i][1<<(i-1)]=0;
for(int j=1;j<(1<<num);++j){
for(int i=1;i<=num;++i){
if(!(j&(1<<(i-1))))continue;
for(int k=1;k<=num;++k){
if(!(j&(1<<(k-1))))continue;
if(i==k)continue;
f[i][j]=min(f[i][j],f[k][j^(1<<(i-1))]+dis[k][i]);
}
}
}
for(int i=1;i<=num;++i)ans=min(ans,f[i][(1<<num)-1]);
printf("%d\n",ans);
return 0;
}
原文:https://www.cnblogs.com/PPXppx/p/11729413.html