hdu 1023 Train Problem II 双向广搜

http://acm.hdu.edu.cn/showproblem.php?pid=1023

 

 

  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<queue>
  6 #include<math.h>
  7 #include<algorithm>
  8 using namespace std;
  9 
 10 char s[802][802];
 11 struct node
 12 {
 13     int x,y;
 14 } M,G,Z[3];
 15 
 16 bool vis[2][802][802],flag;
 17 int dis[4][2]= {{1,0},{-1,0},{0,1},{0,-1}},n,mm;
 18 queue<node> q[2];
 19 
 20 
 21 
 22 int ok(int xx,int yy,int step)
 23 {
 24     int a,b;
 25     a=(abs(xx-Z[0].x)+abs(yy-Z[0].y)+1)/2;
 26     b=(abs(xx-Z[1].x)+abs(yy-Z[1].y)+1)/2;
 27     a=min(a,b);//  ghost 在第几秒走到这里
 28     if(a>step)
 29         return 1;
 30     return 0;
 31 }
 32 
 33 void bfs(int x,int step)
 34 {
 35     if(flag==true)
 36         return ;
 37     int size1=q[x].size();
 38     while(size1--)
 39     {
 40         node temp,temp1; temp=q[x].front(); q[x].pop();
 41         if(!ok(temp.x,temp.y,step))
 42             continue;
 43         for(int i=0;i<4;i++)
 44         {
 45             int xx,yy;
 46             xx=temp.x+dis[i][0];  yy=temp.y+dis[i][1];
 47             if(xx>=0&&xx<n&&yy>=0&&yy<mm&&vis[x][xx][yy]==false&&s[xx][yy]!='X'&&ok(xx,yy,step))
 48             {
 49                 vis[x][xx][yy]=true;
 50                 if(vis[x^1][xx][yy])
 51                 {
 52                     flag=1;
 53                     return ;
 54                 }
 55                 temp1.x=xx;
 56                 temp1.y=yy;
 57                 q[x].push(temp1);
 58             }
 59         }
 60     }
 61 }
 62 
 63 void tbfs()
 64 {
 65     node temp;
 66     temp.x=M.x;    temp.y=M.y;
 67     q[0].push(temp);
 68     vis[0][temp.x][temp.y]=true;/////
 69 
 70     temp.x=G.x;    temp.y=G.y;
 71     q[1].push(temp);
 72     vis[1][temp.x][temp.y]=true;////
 73     int ans=0;
 74     flag=false;
 75     while(!q[0].empty()||!q[1].empty())
 76     {
 77         ans++;
 78         bfs(0,ans);
 79         bfs(0,ans);
 80         bfs(0,ans);
 81         bfs(1,ans);
 82         if(flag)
 83         {
 84             printf("%d\n",ans);
 85             return ;
 86         }
 87     }
 88     printf("-1\n");
 89 }
 90 
 91 void solve()
 92 {
 93     while(!q[0].empty())
 94         q[0].pop();
 95     while(!q[1].empty())
 96         q[1].pop();
 97     memset(vis,false,sizeof(vis));
 98     tbfs();
 99 }
100 
101 int main()
102 {
103     int t;
104     scanf("%d",&t);
105     while(t--)
106     {
107         scanf("%d%d",&n,&mm);
108         int num=0;
109         for(int i=0; i<n; i++)
110         {
111             scanf("%s",s[i]);
112             for(int j=0; j<mm; j++)
113             {
114                 if(s[i][j]=='M')
115                 {
116                     M.x=i;
117                     M.y=j;
118                 }
119                 if(s[i][j]=='G')
120                 {
121                     G.x=i;
122                     G.y=j;
123                 }
124                 if(s[i][j]=='Z')
125                 {
126                     Z[num].x=i;
127                     Z[num++].y=j;
128                 }
129             }
130         }
131         solve();
132 
133     }
134     return 0;
135 }

 

posted @ 2014-05-06 15:04  galaxy77  阅读(139)  评论(0编辑  收藏  举报