提交时间:2022-08-10 11:41:16

运行 ID: 55192

#include <bits/stdc++.h> using namespace std; int col[55][55],n,m,dis1[55][55][5],dis2[5][5]; int dx[5]= {0,1,0,-1,0},dy[5]= {0,0,1,0,-1}; char Map[55][55]; inline bool Check(int x,int y) { if(x<=0 || x>n || y<=0 || y>m || Map[x][y]!='X') return 0; return 1; } inline void Paint(int x,int y,int c) { col[x][y]=c,Map[x][y]='Y'; for(int i=1; i<=4; i++) if(Check(x+dx[i],y+dy[i])) Paint(x+dx[i],y+dy[i],c); } int main() { //freopen("mst2.in","r",stdin); //freopen("ans.txt","w",stdout); ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>m; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin>>Map[i][j]; int c=1; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(Map[i][j]=='X') Paint(i,j,c++); memset(dis1,0x3f,sizeof(dis1)); memset(dis2,0x3f,sizeof(dis2)); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { if(col[i][j]==0) continue; int block1=col[i][j]; for(int k=1; k<=n; k++) for(int x=1; x<=m; x++) { if(col[k][x]==0) dis1[k][x][block1]=min(dis1[k][x][block1],abs(i-k)+abs(j-x)-1); else { int block2=col[k][x]; if(block1>=block2) continue; dis2[block1][block2]=min(dis2[block1][block2],abs(i-k)+abs(j-x)-1); } } } int ans=0x7fffffff; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(col[i][j]==0) ans=min(ans,dis1[i][j][1]+dis1[i][j][2]+dis1[i][j][3]+1); ans=min(ans,min(dis2[1][2]+dis2[1][3],min(dis2[1][2]+dis2[2][3],dis2[1][3]+dis2[2][3]))); cout<<ans<<'\n'; return 0; }