POJ 2312


这个是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;
}

路途中。。。。

你可能感兴趣的:(DP+FS)