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
- hdoj 1242 Rescue (bfs+优先队列)
- HDOJ 1242 Rescue(BFS + 优先队列)
- HDOJ 1242 Rescue (BFS+优先队列)
- HDOJ 1242 Rescue 优先队列+bfs
- hdoj 1242 Rescue 【BFS + 优先队列】
- HDOJ 1242 Rescue(bfs+优先队列)
- HDOJ-1242(Rescue)(bfs+优先队列)
- hdoj 1242 Rescue (bfs 优先队列)
- HDOJ 1242 Rescue(优先队列+BFS)
- HDOJ 1242 Rescue (BFS + 优先队列)
- HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
- hdu 1242Rescue(bfs+优先队列)
- hdu 1242 Rescue (优先队列+bfs)
- HDU 1242 Rescue(BFS +优先队列)
- 1242Rescue (优先队列BFS)
- HDU 1242 Rescue(BFS,优先队列)
- hdu 1242 Rescue(BFS优先队列)
- HDU 1242 Rescue(优先队列+bfs)
- duilib入门教程
- Android 文件加密及解密手册,方便查询记忆
- PING监测网络状态改变的SHELL脚本
- 云计算简介
- [工具设置]InstallShield安装包制作
- hdoj 1242 Rescue (bfs+优先队列)
- 搭建JavaWeb项目资料整理
- vc 查看硬盘盘符剩余空间
- 面试宝典14.5.5
- 利用递归算法排序
- 西普学院 writeup 凯撒是罗马共和国杰出的军事统帅
- (荐)跟我学SpringMVC目录汇总贴、PDF下载、源码下载
- 【NOI2015】【寿司晚宴】【状压DP】
- 关于理解内存管理