hdoj 1242 Rescue (bfs+优先队列)

来源:互联网 发布:淘宝客双十一 编辑:程序博客网 时间:2024/05/21 09:44

运算符重载定义:

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

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

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

{

     <函数体>

}


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

 wa码

#include<stdio.h>

<span style="font-size:14px;">#include<string.h>#include<queue>#define inf 0xffffffusing 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<f)f=c;return;}if(a[x][y]=='.')c++;    if(a[x][y]=='x')c+=2;vis[x][y]=1;dfs(x+1,y,c);dfs(x,y+1,c);dfs(x-1,y,c);dfs(x,y-1,c);vis[x][y]=0;if(a[x][y]=='.')c--;    if(a[x][y]=='x')c-=2;}int main(){int i,j,x,y;while(scanf("%d%d",&m,&n)!=EOF){memset(vis,0,sizeof(vis));for(i=0;i<m;i++)for(j=0;j<n;j++){scanf(" %c",&a[i][j]);}for(i=0;i<m;i++)for(j=0;j<n;j++){if(a[i][j]=='r'){sx=i;sy=j;vis[i][j]=1;}if(a[i][j]=='a'){ ex=i; ey=j;}}f=inf;dfs(sx,sy,0);if(f<m*n)            printf("%d\n",f);        else            printf("Poor ANGEL has to stay in the prison all his life.\n");}return 0;}</span>


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

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

  priority_queue<node> q;

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

<span style="white-space:pre"></span><span style="font-size:32px;color:#ff0000;"><strong>ac码</strong></span>
#include<stdio.h>#include<string.h>#include<queue>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.step<step;    }*/    friend bool operator < (node a,node b) //这种方法和前一种是一样的,是重载运算符  {return a.step>b.step;}};  //结构体变量后边加分号 /*int cmp(node a ,node b){return a.step<b.step;}*/int bfs(int sx,int sy){node next,cur;    //定义结构体应该就这样定义priority_queue<node> 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;elsenext.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<m;i++)for(j=0;j<n;j++){scanf(" %c",&a[i][j]);}for(i=0;i<m;i++)for(j=0;j<n;j++){if(a[i][j]=='r'){sx=i;sy=j;vis[i][j]=1;}if(a[i][j]=='a'){ ex=i; ey=j;}}int cnt=bfs(sx,sy);if(cnt!=-1)            printf("%d\n",cnt);        else            printf("Poor ANGEL has to stay in the prison all his life.\n");}return 0;}


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

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


0 0
原创粉丝点击