hdu2612 Find a way BFS

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612

思路:

裸的BFS,对于Y,M分别进行BFS,求出其分别到达各个点的最小时间;

然后对于@的点,将两者的最小时间相加即为到达此点的总时间,遍历所有@点,更新结果即可;

代码:

  1 #include<iostream>
  2 #include<cstdlib>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<queue>
  6 #define MAX 0x7f7f7f7f 
  7 using namespace std;
  8 int n,m;
  9 int startY_x,startY_y;
 10 int startM_x,startM_y;
 11 char map[210][210];
 12 int d[4][2]={1,0,-1,0,0,1,0,-1};
 13 int vis1[210][210];
 14 int vis2[210][210];
 15 class node
 16 {
 17         public:
 18         int x;
 19         int y;
 20         int time;
 21 }cur,next;
 22 queue<node>q;
 23 bool Jude(int x,int y)
 24 {
 25       if(x<0||x>=n||y<0||y>=m||map[x][y]=='#')
 26               return false;
 27       return true;
 28 }
 29 void init()
 30 {
 31         for(int i=0;i<210;i++)
 32                 for(int j=0;j<210;j++)
 33                 {
 34                         vis1[i][j]=0;
 35                         vis2[i][j]=0;
 36                 }
 37 
 38 }
 39 void  bfs(int key)
 40 {
 41         while(!q.empty())
 42         {
 43                cur=q.front();
 44                q.pop();
 45                for(int i=0;i<4;i++)
 46                {
 47                        int x=cur.x+d[i][0];
 48                        int y=cur.y+d[i][1];
 49                        if(!Jude(x,y)) continue;
 50                        if(key==1) 
 51                                {
 52                                       if(vis1[x][y]) continue;
 53                                       next.x=x;
 54                                       next.y=y;
 55                                       next.time=cur.time+1;
 56                                       vis1[x][y]=next.time;
 57                                       q.push(next);
 58                                }
 59                        if(key==2)
 60                                 {
 61                                         if(vis2[x][y]) continue;
 62                                         next.x=x;
 63                                         next.y=y;
 64                                         next.time=cur.time+1;
 65                                         vis2[x][y]=next.time;
 66                                         q.push(next);
 67                                 }
 68                 }
 69         }
 70 }
 71 int  main()
 72 {
 73         while(scanf("%d%d",&n,&m)!=EOF)
 74         {
 75                 init();
 76                 for(int i=0;i<n;i++)
 77                 {
 78                        for(int  j=0;j<m;j++)
 79                        {
 80                                cin>>map[i][j];
 81                                if(map[i][j]=='Y')
 82                                {
 83                                        startY_x=i;
 84                                        startY_y=j;
 85                                }
 86                                if(map[i][j]=='M')
 87                                {
 88                                        startM_x=i;
 89                                        startM_y=j;
 90                                }     
 91                        }
 92                 }
 93 
 94                 cur.x=startY_x;
 95                 cur.y=startY_y;
 96                 cur.time=0;
 97                 vis1[cur.x][cur.y]=1;
 98                 q.push(cur);
 99                 bfs(1);
100 
101                 while(!q.empty()) q.pop();
102                 cur.x=startM_x;
103                 cur.y=startM_y;
104                 cur.time=0;
105                 vis2[cur.x][cur.y]=1;
106                 q.push(cur);
107                 bfs(2);
108 
109                 long long ans=MAX;
110                 for(int i=0;i<n;i++)
111                         for(int j=0;j<m;j++)
112                         {
113                                if(map[i][j]=='@' && vis1[i][j] && vis2[i][j])
114                                {
115                                        long long  temp=vis1[i][j]+vis2[i][j];
116                                        ans=min(ans,temp);
117                                }
118                         }
119                  cout<<ans*11<<endl;
120 }
121         return 0;
122 }
View Code

 

posted on 2013-08-09 19:56  GyyZyp  阅读(171)  评论(0编辑  收藏  举报

导航