这个是BFS+优先队列,开始知道的时候就用步伐做优先的值。。
没有考虑在'B' (brick wall) 时候的延迟一步就答案错了几次,不知道错在哪,百度的时候才知道要加。。。
1.基本操作:
empty() 如果队列为空返回真
pop() 删除队首元素
push(x) 加入x元素
size() 返回当前队列中元素个数
top() 返回队首元素
2、ElemType为结构体类型
//一般采用重载运算符“<”进行优先级比较//只能重载“<”? why!
struct node{
int x, y;
bool operator< (const node& t) const {
return x>t.x||(x==t.x&&y>t.y); //以x为第一关键字,y为第二关键字。值越小越优先
}
};
AC带代码:
#include
#include
#include
#include
using namespace std;
char q[308][308];
int w[308][308];
int n,m;
struct node{
int a,b;
int pri;
bool operator<(const node &g) const{
return pri > g.pri;
}
};
int getes(int a,int b){
if(q[a][b] != 'S' && q[a][b] != 'R' && w[a][b]==0){
if(a >=1 && a <= n && b >=1 && b <=m){
return 1;
}
}
return 0;
}
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int bfs(int x,int y){
priority_queue que;
node in,out;
int e,f,i;
in.a=x;
in.b=y;
in.pri=0;
que.push(in);
while(que.size() != 0){
out=que.top();
que.pop();
e=out.a;
f=out.b;
if(q[e][f] == 'T'){
return out.pri;
}
for(i=0;i<4;i++){
e=dir[i][0]+out.a;
f=dir[i][1]+out.b;
if(getes(e,f) == 1){
in.a=e;
in.b=f;
in.pri=out.pri+1;
w[e][f]=1;
if(q[e][f] == 'B') in.pri++;
que.push(in);
}
}
}
return 0;
}
int main(){
int i,j,sum,ant;
int c,d;
while(~scanf("%d%d",&n,&m) && n && m){
memset(w,0,sizeof(w));
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>q[i][j];
if(q[i][j]=='Y'){
c=i;
d=j;
}
}
}
w[c][d]=1;
sum=bfs(c,d);
if(sum == 0) printf("-1\n");
else printf("%d\n",sum);
}
return 0;
}