题意:模拟坦克大战,正常行驶花费时间为一,遇见木板花费时间为二,求从某几点到目标点的最短时间
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <functional>
#include <queue>
#include <vector>
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_queue<node>q;
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;
}