hdu 1242 Rescue

优先队列+广度搜索

第一次优先队列,重载操作符不是我写的……………………

代码,参考大牛的……

………………

原来优先队列+BFS是这样滴

#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
char s[201][201];
int n,m,vis[200][200],ans;
int  dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool es;
struct node
{   
	int x,y,dis; 
	node(int _x=0,int _y=0,int _dis=0):x(_x),y(_y),dis(_dis){};   //自动初始化
	friend bool operator<(const node &a,const node & b) //重载操作符
	{     
		return a.dis>b.dis; 
	}
};
	node f,e;
void dfs()
{
	priority_queue <node> q;
	f.dis=0;
	q.push(f);
	vis[f.x][f.y]=1;
	while(!q.empty())
	{
		node t=q.top();
		q.pop();
		for(int k=0;k<4;k++)
		{
			int i=t.x+dir[k][1];
			int j=t.y+dir[k][0];
			if(i<=n&&i>0&&j<=m&&j>0&&!vis[i][j]&&s[i][j]!='#')
			{
				vis[i][j]=1;
				if(s[i][j]=='x')
					q.push(node(i,j,t.dis+2));
				if(s[i][j]=='.')
					q.push(node(i,j,t.dis+1));
				if(s[i][j]=='a')
				{
					es=1;ans=t.dis+1;
					return ;
				}
			}
		}
	}
	return ;
}
int main()
{
	while(cin>>n>>m)
	{
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			{
				cin>>s[i][j];
				if(s[i][j]=='r')//找出起点
				{f.x=i;f.y=j;}
				else if(s[i][j]=='a')
				{e.x=i;e.y=j;}
			}
			es=0;
			dfs();
		if(es)
			cout<<ans<<endl;
		else cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
	}
	return 0;
}
原文地址:https://www.cnblogs.com/nanke/p/2123211.html