HDU 1242 Rescue BFS+优先队列

Posted claireyuancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1242 Rescue BFS+优先队列相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1242


#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int N=220;
int n,m,stx,sty,endx,endy;
char mp[N][N];
int vis[N][N]; 
int f[4][2]={{0,-1},{-1,0},{0,1},{1,0}};//keng
struct node
{
	int x;
	int y;
	int t; 
	friend bool operator < (const node &a,const node &b) 
	{
		return a.t>b.t;//大于是从小往大排 
	}
} ;
bool isbound(int x,int y)
{
	if(x>0&&x<=n&&y>0&&y<=m&&mp[x][y]!='#')
		return true;	
	else
	    return false;
}
void BFS(int x,int y)
{
	priority_queue<node>Q;
	memset(vis,0,sizeof(vis));
	while(!Q.empty())
	{
		Q.pop();
	}
	node p,q;	
	p.x=x;
	p.y=y;
	p.t=0;
	vis[p.x][p.y]=1;
	Q.push(p); 
	while(!Q.empty())
	{
		p=Q.top();
		Q.pop() ;
		if(p.x==endx&&p.y==endy)
		{
			printf("%d\n",p.t);
			return;
		}
		for(int i=0;i<4;i++)
		{
			q.x=p.x+f[i][0];
			q.y=p.y+f[i][1];
			if(!isbound(q.x,q.y)) continue;
			if(vis[q.x ][q.y ]==1) continue;
			vis[q.x ][q.y]=1;
			if(mp[q.x ][q.y]=='x')
				q.t =p.t + 2;
			else
				q.t =p.t + 1;
			Q.push(q);
		}
		
	}
	printf("Poor ANGEL has to stay in the prison all his life.\n");
}
int main()
{
	while(~scanf("%d%d",&n,&m)) 
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>mp[i][j];
				if(mp[i][j]=='r')
				{
					stx=i;
					sty=j;
				}
				else if(mp[i][j]=='a')
				{
					endx=i;
					endy=j;
				}
			}
		}
		BFS(stx,sty);
	}
	return 0;
}


以上是关于HDU 1242 Rescue BFS+优先队列的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1242 Rescue (BFS+优先队列)

HDU 1242 Rescue BFS+优先队列

hdu Rescue (bfs)

[ACM] hdu 1242 BFS

HDU 1242 Rescue(BFS)

HDU 1242 (BFS+优先队列)