1 条题解
-
0
C++ :
#include <stdio.h> #include <string.h> #include <queue> using namespace std; int n,m,mark; const int inf=100000000; char a[101][101]; int b[5][5],flag[101][101]; int dre[4][2]={1,0,0,1,-1,0,0,-1}; struct node { int x,y,t; }p; int bfs(int sx,int sy,int dx,int dy) { queue<node> q; int x,y,t,u,v,i; memset(flag,0,sizeof(flag)); p.x=sx; p.y=sy; p.t=0; flag[sx][sy]=1; q.push(p); while(!q.empty()) { p=q.front(); q.pop(); x=p.x; y=p.y; t=p.t; if(x==dx&&y==dy) return t; for(i=0;i<4;i++) { u=x+dre[i][0]; v=y+dre[i][1]; if(u>=0&&u<n&&v>=0&&v<m&&a[u][v]!='*'&&flag[u][v]==0) { flag[u][v]=1; p.x=u; p.y=v; p.t=t+1; q.push(p); } } } mark=1; return -1; } int main() { int i,j,k,T,min; int x[5],y[5],s[6]; scanf("%d",&T); while(T--) { scanf("%d%d%*c",&n,&m); for(i=0;i<n;i++) { scanf("%s",a[i]); for(j=0;j<m;j++) if(a[i][j]=='S') { x[0]=i; y[0]=j; } else if(a[i][j]=='A') { x[1]=i; y[1]=j; } else if(a[i][j]=='B') { x[2]=i; y[2]=j; } else if(a[i][j]=='C') { x[3]=i; y[3]=j; } else if(a[i][j]=='D') { x[4]=i; y[4]=j; } } mark=0; for(i=0;i<5;i++) { for(j=0;j<=i;j++) { if(j==0&&i==4) { b[i][j]=b[j][i]=inf; continue; } else if(i==j) { b[i][j]=0; continue; } b[i][j]=b[j][i]=bfs(x[i],y[i],x[j],y[j]); if(mark) break; } if(mark) break; } if(mark) { printf("-1\n"); continue; } min=inf; s[0]=b[0][1]+b[1][2]+b[2][3]+b[3][4]; s[1]=b[0][1]+b[1][3]+b[3][2]+b[2][4]; s[2]=b[0][2]+b[2][1]+b[1][3]+b[3][4]; s[3]=b[0][2]+b[2][3]+b[3][1]+b[1][4]; s[4]=b[0][3]+b[3][1]+b[1][2]+b[2][4]; s[5]=b[0][3]+b[3][2]+b[2][1]+b[1][4]; for(i=0;i<6;i++) if(s[i]<min) min=s[i]; printf("%d\n",min); } return 0; }
- 1
信息
- ID
- 982
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者