#include <stdio.h>
#include <queue>
#include <cstring>
using namespace std;
char a[305][305];
int n,m;
int sx,sy,ex,ey;
int v[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
bool f[305][305];
struct node
{
int x,y,w;
bool operator < (const node& q) const
{
return w > q.w;
}
};
int fun()
{
priority_queue<node> que;
node g;
g.x = sx;
g.y = sy;
g.w = 0;
que.push(g);
f[sx][sy] = true;
while(!que.empty())
{
node tm = que.top();
que.pop();
for(int i = 0; i < 4;i++)
{
node q;
q.x = tm.x + v[i][0];
q.y = tm.y + v[i][1];
q.w = tm.w;
if(!f[q.x][q.y])
switch(a[q.x][q.y])
{
case 'S':
case 'R':
{
break;
}
case 'B':
{
q.w += 2;
que.push(q);
f[q.x][q.y] = true;
break;
}
case 'E':
{
q.w += 1;
que.push(q);
f[q.x][q.y] = true;
break;
}
case 'T':
{
return q.w+1;
}
}
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m), n||m)
{
for(int i = 0; i <= m+1;i++)
{
a[0][i] = 'S';
a[n+1][i] = 'S';
}
for(int i = 0 ; i<= n+1;i++)
{
a[i][0] = 'S';
a[i][m+1] = 'S';
}
getchar();
memset(f,0,sizeof(f));
for(int i = 1; i <= n;i++ )
{
for(int j = 1; j <= m;j++)
{
a[i][j] = getchar();
if(a[i][j] == 'Y')
{
sx = i;
sy = j;
}
}
getchar();
}
printf("%d\n",fun());
}
return 0;
}
POJ 2312<优先队列><最短路>
最新推荐文章于 2020-03-01 14:33:28 发布