运算符重载定义:
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
这两句加起来才算是定义了结构体队列的优先级
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
为什么最后输出的步数是最小的?
因为每次把步数放入队列的时候,利用队列的优先级把每次走后步数最小的放在最前边,每次取顶元素取得都是步数最小的,当然也是最先找到公主的!