杭电2612

来源:互联网 发布:python入门经典pdf下载 编辑:程序博客网 时间:2024/06/06 04:54

请注意一次把所有可到达的点所花最短时间算一遍,比每找到@再寻找快!!!

一次一次找就会超时!!!

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;char mapp[210][210];#define inf 100000000int n,m;int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};int pos1x,pos1y,pos2x,pos2y,posdx,posdy;int visit[210][210];int dist1[210][210],dist2[210][210];struct stu{int x,y,step;};int BFS(stu stu1,int dist[][210]){int i;queue<stu>k;stu stu2;memset(visit,0,sizeof(visit));      memset(dist,0,sizeof(dist)); k.push(stu1);while(!k.empty()){stu1=k.front();k.pop();for(i=0;i<4;i++){stu2.x=stu1.x+dir[i][0];stu2.y=stu1.y+dir[i][1];stu2.step=stu1.step+11;if(stu2.x>=0&&stu2.x<n&&stu2.y>=0&&stu2.y<m&&visit[stu2.x][stu2.y]!=1&&mapp[stu2.x][stu2.y]!='#'){visit[stu2.x][stu2.y]=1;dist[stu2.x][stu2.y]=stu2.step;k.push(stu2);}}}}int main(){int i,j,sum,Min;stu stu1;while(~scanf("%d%d",&n,&m)){Min=inf;for(i=0;i<n;i++){cin>>mapp[i];}for(i=0;i<n;i++){for(j=0;j<m;j++){if(mapp[i][j]=='Y'){pos1x=i;pos1y=j;}if(mapp[i][j]=='M'){pos2x=i;pos2y=j;}}}stu1.x=pos1x;stu1.y=pos1y;stu1.step=0;BFS(stu1,dist1);//第一个人所有可到达的点所花最短时间 stu1.x=pos2x;stu1.y=pos2y;stu1.step=0;BFS(stu1,dist2);//第二个人所有可到达的点所花最短时间  for(i=0;i<n;i++){for(j=0;j<m;j++){if(mapp[i][j]=='@'){if(dist1[i][j]!=0&&dist2[i][j]!=0){Min=min(dist1[i][j]+dist2[i][j],Min); }}}}cout<<Min<<endl;}return 0;}


0 0
原创粉丝点击