hdoj 1242 Rescue (bfs+优先队列)

运算符重载定义:

C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。

运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:

  <返回类型说明符> operator <运算符符号>(<参数表>)

{

     <函数体>

}


思路:其实我试了下 用dfs写可总是wa(组长说就算对了,也肯定超时)

  wa码

#include

#include
#include
#define inf 0xffffff
using namespace std;
int vis[300][300];
char a[300][300];
int ex,ey,m,n,sx,sy,f;
int dx[4]={-1,0,0,1};
int dy[4]={0,1,-1,0};
void dfs(int x,int y,int c)
{
    if(x<0||x>=m||y<0||y>=n||a[x][y]=='#'||vis[x][y])
    return ;
	if(x==ex&&y==ey)
	{
		if(c


然后用了bfs,一开始不知道怎么定义队列的优先级,总是错,后来上网才知道这种定义和平时看到的并不一样

friend bool operator < (node a,node b) 
{
return a.step>b.step;
}

  priority_queue q;

这两句加起来才算是定义了结构体队列的优先级


					ac码


#include
#include
#include
using namespace std;
int vis[300][300];
char a[300][300];
int ex,ey,m,n,sx,sy;
int dx[4]={-1,0,0,1};
int dy[4]={0,1,-1,0};
struct node
{
	int x;
	int y;
	int step;
/*	bool operator < (const node &a) const
	{
        return a.stepb.step;
	}
};  //结构体变量后边加分号 
/*int cmp(node a ,node b)
{
	return a.step q;  //此句加上前边的重载运算符就是定义结构体优先队列 
	while(!q.empty())
	q.pop();		//用队列就要记住清空队列 
	cur.x=sx,cur.y=sy;
	cur.step=0;
	q.push(cur);
	vis[cur.x][cur.y]=1;
	while(!q.empty())
	{
		cur=q.top();   
		q.pop();
		if(cur.x==ex&&cur.y==ey)
		return cur.step; 
		for(int i=0;i<4;i++)
		{
			next.x=cur.x+dx[i];
			next.y=cur.y+dy[i];
			if(next.x<0||next.x>=m||next.y<0||next.y>=n||a[next.x][next.y]=='#')
			continue;
			if(!vis[next.x][next.y])
			{
				vis[next.x][next.y]=1;
				if(a[next.x][next.y]=='x')
				next.step=cur.step+2;
				else
				next.step=cur.step+1;
				q.push(next);
			}
		}
	}
	return -1;
}
int main()
{
	int i,j,x,y;
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		memset(vis,0,sizeof(vis));
		for(i=0;i


为什么最后输出的步数是最小的?

因为每次把步数放入队列的时候,利用队列的优先级把每次走后步数最小的放在最前边,每次取顶元素取得都是步数最小的,当然也是最先找到公主的!


你可能感兴趣的:(递归与深度优先搜索)