Find a way (BFS)

Find a way

 HDU - 2612 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<queue>
  6 using namespace std;
  7 
  8 char map[201][201];
  9 int book1[205][205],book2[205][205];
 10 int step1[205][205],step2[205][205];
 11 int dir[4][2]={ {1,0},{0,1},{-1,0},{0,-1} };
 12 int n,m,x1,y1,x2,y2;
 13 
 14 struct note
 15 {
 16     int x;
 17     int y;
 18     int s; 
 19 }a,b;
 20 queue<note>q;
 21 
 22 void bfs1(int xx,int yy)
 23 {
 24     memset(book1,0,sizeof(book1));
 25     while(!q.empty()) //清空 
 26         q.pop();
 27     a.x= xx;
 28     a.y= yy;
 29     a.s= 0 ;
 30     book1[a.x][a.y]=1;
 31     step1[a.x][a.y]=0;
 32     q.push(a);
 33     while(!q.empty())
 34     {
 35         a=q.front();
 36         q.pop();//及时出队 
 37         for(int i=0;i<4;i++)
 38         {
 39             b.x=a.x+dir[i][0];
 40             b.y=a.y+dir[i][1];
 41             if(map[b.x][b.y]=='#'||
 42                 book1[b.x][b.y]==1||
 43                 b.x<1||b.x>n||b.y<1||b.y>m)
 44                 continue;
 45             book1[bx][by]= 1 ; // mark: walked 
46              bs=a.s+ 11 ;
 47              step1[bx][by]=bs;   // record the number of steps to each position 
48              q.push (b); // Enqueue 
49          }
 50      }
 51      return ;
 52  }
 53  
54  void bfs2( int xx, int yy)
 55  {
 56      memset(book2, 0 , sizeof (book2));
 57      while (!q.empty())
 58         q.pop();
 59     a.x= xx;
 60     a.y= yy;
 61     a.s= 0 ;
 62     book2[a.x][a.y]=1;
 63     step2[a.x][a.y]=0;
 64     q.push(a); 
 65     while(!q.empty())
 66     {
 67         a=q.front();
 68         q.pop(); 
 69         for(int i=0;i<4;i++)
 70         {
 71             b.x=a.x+dir[i][0];
 72             b.y=a.y+dir[i][1];
 73             if(map[b.x][b.y]=='#'||
 74                 book2[b.x][b.y]==1||
 75                 b.x<1||b.x>n||b.y<1||b.y>m)
 76                 continue;
 77             book2[b.x][b.y]=1;
 78             b.s=a.s+11;
 79             step2[b.x][b.y]=b.s;
 80             q.push(b);
 81         }
 82     }
 83     return;
 84 }
 85 
 86 int main()
 87 {
 88     while(cin>>n>>m)
 89     {
 90         for(int i=1;i<=n;i++)
 91         {
 92             for(int j=1;j<=m;j++)
 93             {
 94                 cin>>map[i][j];
 95                 if(map[i][j]=='Y')
 96                 {
 97                     x1=i; y1=j;
 98                 }
 99                 else if(map[i][j]=='M')
100                 {
101                     x2=i; y2=j;
102                 }
103             }
104         }
105         
106         bfs1(x1,y1);
107         bfs2(x2,y2);
108         
109         int minn=0x3f3f3f3f;
110          for ( int i= 1 ;i<=n;i++ )
 111          {
 112              for ( int j= 1 ;j<=m;j++ )
 113              {
 114                  if (map[i][j]== ' @ ' &&book1 [i][j]== 1 &&book2[i][j]== 1 ) //Be sure to check the book here (because someone may not be able to reach the place @ 
 115                      minn=min( minn, step1[i][j] + step2[i][j]);
 116              }
 117          }
 118          cout<<minn<< endl;
 119      }
120 }

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325279841&siteId=291194637