# include<stdio.h>
# include<queue>
# include<string.h>
using namespace std;
char map[305][305],flag[305][305];
struct steps
{
int i;
int j;
int step;
};
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool operator <(steps a, steps b)
{
return a.step>b.step;
}
int main()
{
int n,m,i,j,x,y,a,b,k;
while(scanf("%d%d",&n,&m)&&n&&m)
{
steps p;
getchar();
priority_queue<steps>s;
k=0;
memset(flag,0,sizeof(flag));
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%c",&map[i][j]);//printf("%d %d\n",i,j);
if(map[i][j]=='Y')
{//printf("%d %d\n",i,j);
p.i=i;
p.j=j;
flag[i][j]=1;
p.step=1;
s.push(p);
}
if(map[i][j]=='T')
{
x=i;
y=j;
}
}
getchar();
}
while(!s.empty())
{
steps t,v;
t=s.top();
s.pop();
//printf("%d %d %d\n",t.i,t.j,t.step);
if(t.i==x&&t.j==y)
{
printf("%d\n",t.step);
k=1;
break;
}
for(i=0;i<4;i++)
{
v.i=t.i+dir[i][0];
v.j=t.j+dir[i][1];
if(v.i>=0&&v.i<n&&v.j>=0&&v.j<m)
{
if(flag[v.i][v.j]==0&&(map[v.i][v.j]=='E'||map[v.i][v.j]=='B'||map[v.i][v.j]=='T'))
{
if(map[v.i][v.j]=='E')
v.step=t.step+1;
else if(map[v.i][v.j]=='B')
v.step=t.step+2;
else
v.step=t.step;
flag[v.i][v.j]=1;
s.push(v);
}
}
}
}
if(k==0)
printf("-1\n");
}
return 0;
}
广搜+优先队列
最新推荐文章于 2022-04-15 15:18:06 发布