hdu 1242 rescue

怎么说,本人还是比较喜欢做搜索题的。

这题我是用优先队列+BFS做的,由于其实r是只有一个的,用dfs+剪枝也是可以的。

也是很久没写优先队列的原因,都不知道优先队列的用法了,在编译阶段就出了好多错,事实证明ACMER还是得保持每日的做题量,不然忘记的可是贼快贼快的。

但是解决了编译问题后就直接AC了。由于只是最普通的搜索题。

这是AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,xx,yy,f;
int vis[205][205];
char map[205][205];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node
{
	int x,y,step;
	friend bool operator <(const node a,const node b)
	{
		return a.step>b.step;
	}
};
void bfs()
{
	node p;
	p.x=xx;
	p.y=yy;
	p.step=0;
	priority_queue<node> qq;
	qq.push(p);
	vis[xx][yy]=1;
	while(!qq.empty())
	{
		node q;
		q=qq.top();
		qq.pop();
		for(int i=0;i<4;i++)
		{
			int x=q.x+dir[i][0];
			int y=q.y+dir[i][1];
			int step;
			if(map[x][y]=='r')
			{
				f=1;
				printf("%d\n",q.step+1);
				return ;
			}
			if((map[x][y]=='.'||map[x][y]=='x')&&x>=0&&y>=0&&x<n&&y<m&&!vis[x][y])
			{
				if(map[x][y]=='.')
				{
					step=q.step+1;
					node w;
					w.x=x,w.y=y,w.step=step;
					qq.push(w);
				}
				else
				{
					step=q.step+2;
					node w;
					w.x=x,w.y=y,w.step=step;
					qq.push(w);
				}
				vis[x][y]=1;
			}
		}
	}
	
}
int main(void)
{
	while(scanf("%d%d",&n,&m)!=EOF){
		for(int i=0;i<n;i++)
			scanf("%s",&map[i]);
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				if(map[i][j]=='a'){
					xx=i;
					yy=j;
				}
		f=0;
		memset(vis,0,sizeof(vis));
		bfs();
		if(!f)
			printf("Poor ANGEL has to stay in the prison all his life.\n"); 
	}
	return 0;
}


 

你可能感兴趣的:(hdu 1242 rescue)