提交时间:2022-08-09 11:31:21

运行 ID: 55110

#include <bits/stdc++.h> using namespace std; int n,m; char ch; int a[60][60]; int p[60][60][4],tag; queue<int > qx,qy,qw; int vis[60][60]; void dfs(int x,int y){ if(!(x>=1&&x<=n&&y>=1&&y<=m)) return ; //cout<<x<<" "<<y<<endl; vis[x][y]=1; a[x][y]=0; qx.push(x); qy.push(y); qw.push(0); if(!vis[x+1][y]&&a[x+1][y]) dfs(x+1,y); if(!vis[x][y+1]&&a[x][y+1]) dfs(x,y+1); if(!vis[x-1][y]&&a[x-1][y]) dfs(x-1,y); if(!vis[x][y-1]&&a[x][y-1]) dfs(x,y-1); } void nxt(int x,int y,int t,int r){ vis[t][r]=1; if(!(t>=1&&t<=n&&r>=1&&r<=m)) return ; qx.push(t); qy.push(r); qw.push(p[x][y][tag]+1); } void bfs(){ while(!qx.empty()){ int x=qx.front(),y=qy.front(); int w=qw.front(); qx.pop(),qy.pop(),qw.pop(); //cout<<x<<" "<<y<<" "<<w<<endl; p[x][y][tag]=w; // cout<<p[x][y][tag]<<" "<<tag<<"\n"; if(!vis[x+1][y]) nxt(x,y,x+1,y); if(!vis[x][y+1]) nxt(x,y,x,y+1); if(!vis[x-1][y]) nxt(x,y,x-1,y); if(!vis[x][y-1]) nxt(x,y,x,y-1); } } void clr(){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) vis[i][j]=0; } int main(){ scanf("%d%d",&n,&m); ch=getchar(); for(int i=1;i<=n;i++){ while(ch!='.'&&ch!='X') ch=getchar(); for(int j=1;j<=m;j++){ if(ch=='X') a[i][j]=1; ch=getchar(); } } tag=0; int ans=n*m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(a[i][j]==1){ clr(); dfs(i,j); bfs(); tag++; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ans=min(ans,p[i][j][0]+p[i][j][1]+p[i][j][2]-2); } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ for(int k=1;k<=n;k++){ for(int l=1;l<=m;l++){ ans=min(ans,p[i][j][0]+p[i][j][1]+p[k][l][1]+p[k][l][2]-2); ans=min(ans,p[i][j][0]+p[i][j][2]+p[k][l][2]+p[k][l][1]-2); ans=min(ans,p[i][j][2]+p[i][j][0]+p[k][l][0]+p[k][l][1]-2); } } } } printf("%d\n",ans); return 0; }