poj2312 battle city 优先队列+bfs

题意:模拟坦克大战,正常行驶花费时间为一,遇见木板花费时间为二,求从某几点到目标点的最短时间


#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int d[4][2]={1,0,0,1,-1,0,0,-1};
struct node  
{  
    int x,y,time;  
    friend bool operator<(node a, node b)  
    {  
        return a.time> b.time;     
    }  
}; 

int main(int argc, char const *argv[])
{   char a[302][302];
	int vis[302][302];
	priority_queueq;
    node te,ne,no,you;
    int i,j,k,m,n,t,cnt;
    while(~scanf("%d%d",&n,&m))
      {if(n==0 && m==0)break;
       memset(a,0,sizeof(a));
	   memset(vis,0,sizeof(vis));
	   while(!q.empty())q.pop();
       int flag=0;
       for(i=1;i<=n;i++)
       { getchar();
      	for(j=1;j<=m;j++)
      		{scanf("%c",&a[i][j]);
             if(a[i][j]=='Y'){you.x=i;you.y=j;you.time=0;q.push(you);}
            }
       }
      /* for(i=1;i<=n;i++)
       {printf("\n");
      	for(j=1;j<=m;j++)
		  printf("%c",a[i][j]);
	   }*/
       while(!q.empty() && !flag)
       {   no=q.top();
       	   q.pop();
          for(i=0;i<4;i++)
          {
           ne.x=no.x+d[i][0];
           ne.y=no.y+d[i][1];
           if(ne.x>0 && ne.x<=n &&ne.y>0 && ne.y<=m && (a[ne.x][ne.y]=='T'||a[ne.x][ne.y]=='B'||a[ne.x][ne.y]=='E') && vis[ne.x][ne.y]!=1)
             { if(a[ne.x][ne.y]=='B')ne.time=no.time+2;
                else ne.time=no.time+1;
               q.push(ne); 
               vis[ne.x][ne.y]=1;
               if(a[ne.x][ne.y]=='T'){cnt=ne.time;flag=1;break;}
             }
          }
         if(flag)printf("%d\n",cnt);  
       }
       if(q.empty()&& !flag)printf("-1\n");
      }
	return 0;
}


你可能感兴趣的:(acm,stl)