#include"stdio.h" #include"string.h" int tab[4][2]={0,1,1,0,0,-1,-1,0}; int vis1[205][205],count,vis2[205][205]; int n,m; int note[40002][2]; char a[205][205]; int yi[2],me[2],con[205][205]; void bfs(int x1,int y1,int vis[205][205]) { int xx,yy,x,y,i; int q[40005],rear=1,front=0; q[front]=1000*x1+y1; vis[x1][y1]=0; while(front<rear) { x=q[front]/1000; y=q[front]%1000; for(i=0;i<4;i++) { xx=x+tab[i][0]; yy=y+tab[i][1]; if(a[xx][yy]=='#'||xx<0||xx>=n||yy<0||yy>m||vis[xx][yy]!=-1) continue; q[rear++]=1000*xx+yy; vis[xx][yy]=vis[x][y]+1;//记录下走到此位置所需的步数; if(a[xx][yy]=='@') con[xx][yy]+=vis[xx][yy]; } front++; } } void input() { int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='@') {note[count][0]=i;note[count][1]=j;count++;} if(a[i][j]=='Y') {yi[0]=i;yi[1]=j;} if(a[i][j]=='M') {me[0]=i;me[1]=j;} } getchar(); } } int main( ) { int i,j,sum,max,w; while(~scanf("%d%d",&n,&m)) { count=0; max=99999999; getchar(); input(); memset(con,0,sizeof(con)); memset(vis1,-1,sizeof(vis1)); bfs(yi[0],yi[1],vis1); memset(vis2,-1,sizeof(vis2)); bfs(me[0],me[1],vis2); for(i=0;i<count;i++) if(max>con[note[i][0]][note[i][1]]&&vis1[note[i][0]][note[i][1]]!=-1&&vis2[note[i][0]][note[i][1]]!=-1) max=con[note[i][0]][note[i][1]]; printf("%d\n",max*11); } return 0; }
这几个题做得怎么都这么坎坷呢。
注意这题是一次性搜出一个出发点到各个目的地的步数,否则会超时。
代码如下: