hdu Waiting ten thousand years for Love
被这道题坑到了,如果单纯的模拟题目所给的步骤,就会出现同一个位置要走两次的情况。。。所以对于bfs来说会很头痛。
第一个代码是wa掉的代码,经过调试才知道这个wa的有点惨,因为前面的操作有可能会阻止后面的正确操作:
- #include"iostream"
- #include"stdio.h"
- #include"algorithm"
- #include"cmath"
- #include"string.h"
- #include"queue"
- #define mx 100
- using namespace std;
- char castle[mx][mx];
- int n,m,t,p,sx,sy,ex,ey;
- struct node
- {
- int x,y;
- int magic;
- int times;
- char flag;//用来标记当前位置是@还是.
- friend bool operator<(node a,node b)
- {
- if(b.times!=a.times) return b.times<a.times;
- return a.magic<b.magic;
- }
- };
- int dir[][]={{,},{,-},{,},{-,}};
- bool judge(int x,int y)
- {
- if(x>=&&x<n&&y>=&&y<m&&castle[x][y]!='#') return true;
- return false;
- }
- void bfs()
- {
- node cur,next;
- int i;
- cur.x=sx;cur.y=sy;cur.times=;cur.magic=p;cur.flag='.';
- priority_queue<node>q;
- q.push(cur);
- while(!q.empty())
- {
- cur=q.top();
- q.pop();
- // cout<<cur.x<<' '<<cur.y<<' '<<cur.magic<<' '<<cur.times<<' '<<cur.flag<<endl;
- if(cur.x==ex&&cur.y==ey&&cur.times<=t)
- {
- cout<<"Yes, Yifenfei will kill Lemon at "<<cur.times<<" sec."<<endl;
- return;
- }
- if(cur.times>t)
- {
- cout<<"Poor Yifenfei, he has to wait another ten thousand years."<<endl;
- return;
- }
- for(i=;i<;i++)
- {
- next.x=cur.x+dir[i][];
- next.y=cur.y+dir[i][];
- if(judge(next.x,next.y))
- {
- if(cur.flag=='@'&&cur.magic>)
- {
- next.times=cur.times+;
- next.magic=cur.magic-;
- if(castle[next.x][next.y]=='@')next.flag='@';
- else next.flag='.';
- castle[next.x][next.y]='#';
- q.push(next);
- }
- else if(cur.flag=='.')
- {
- if(castle[next.x][next.y]=='@')
- {
- if(cur.magic>)
- {
- next.times=cur.times+;
- next.magic=cur.magic-;
- next.flag='@';
- castle[next.x][next.y]='#';
- q.push(next);
- }
- }
- else
- {
- next.times=cur.times+;
- next.magic=cur.magic;
- next.flag='.';
- castle[next.x][next.y]='#';
- q.push(next);
- if(cur.magic>)
- {
- next.times=cur.times+;
- next.magic=cur.magic-;
- q.push(next);
- }
- }
- }
- }
- }
- }
- cout<<"Poor Yifenfei, he has to wait another ten thousand years."<<endl;
- }
- int main()
- {
- int c=;
- while(scanf("%d%d%d%d",&n,&m,&t,&p)==)
- {
- int i,j;
- for(i=;i<n;i++)
- for(j=;j<m;j++)
- {
- cin>>castle[i][j];
- if(castle[i][j]=='Y') {sx=i;sy=j;castle[i][j]='#';}
- else if(castle[i][j]=='L'){ex=i;ey=j;castle[i][j]='.';}
- }
- cout<<"Case "<<++c<<":"<<endl;
- bfs();
- }
- return ;
- }
参考大神的解法后才知道这题在一开始就应该对步骤简化,因为只有前后两步都是’.'是才可以用走的,。其他任何情况下都要用飞的,所以没有必要像之前那样分
很多种情况讨论。果然编程之前还是要多思考思考尽量简化步骤,这样不仅可以提高效率,而且还可以避免发生不必要的错误。
- #include<iostream>
- #include<algorithm>
- #include<queue>
- using namespace std;
- char g[][];
- bool vis[][][];
- int n,m,p,t,si,sj,ans;
- int dir[][]={{,},{,},{-,},{,-}};
- struct node
- {
- int step,p,x,y;
- node(int a=,int b=,int c=,int d=):x(a),y(b),p(c),step(d){}
- bool friend operator <(const node a,const node b)
- {
- return a.step>b.step;
- }
- };
- void BFS()
- {
- priority_queue<node> Q;
- node f=node(si,sj,p,);
- Q.push(f);
- memset(vis,false,sizeof(vis));
- vis[si][sj][p]=true;
- node temp;
- while(!Q.empty())
- {
- temp=Q.top();
- Q.pop();
- if(temp.step>t)
- return ;
- if(g[temp.x][temp.y]=='L')
- {
- ans=temp.step;
- return ;
- }
- for(int k=;k<;k++)
- {
- int i=dir[k][]+temp.x;
- int j=dir[k][]+temp.y;
- if(i<||i>n- || j< || j>m-||g[i][j]=='#')
- continue;
- if(temp.p!= && !vis[i][j][temp.p-])
- {
- vis[i][j][temp.p-]=true;
- Q.push(node(i,j,temp.p-,temp.step+));
- }
- if(g[temp.x][temp.y]!='@' && g[i][j]!='@'&&!vis[i][j][temp.p])
- {
- vis[i][j][temp.p]=true;
- Q.push(node(i,j,temp.p,temp.step+));
- }
- }
- }
- return ;
- }
- int main()
- {
- int cas=;
- while(scanf("%d %d %d %d",&n,&m,&t,&p)==)
- {
- for(int i=;i<n;i++)
- {
- scanf("%s",g[i]);
- for(int j=;j<m;j++)
- if(g[i][j]=='Y')
- si=i,sj=j;
- }
- ans=;
- BFS();
- printf("Case %d:\n",++cas);
- if(ans>t)
- printf("Poor Yifenfei, he has to wait another ten thousand years.\n");
- else printf("Yes, Yifenfei will kill Lemon at %d sec.\n",ans);
- }
- return ;
- }
hdu Waiting ten thousand years for Love的更多相关文章
- HDU 2653 - Waiting ten thousand years for Love
首先,对于一个 '@' 飞上去,飞下来都要耗1点魔力,所以是两点= = 然后站在同一格 魔力可能不同,所以要增加一维. 还有当前搜到的不一定是最小. 别的也没啥. #include <iostr ...
- hdu 4541 Ten Googol
http://acm.hdu.edu.cn/showproblem.php?pid=4541 打表找规律 #include <cstdio> #include <cstring> ...
- hdu-2619 Love you Ten thousand years
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2619 题目大意: 求出小于n的数的个数,满足ki mod n,1≤i≤n是模n的完全剩余系 解题思路 ...
- HDU2653 BFS+优先队列
Waiting ten thousand years for Love Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/3 ...
- hdu2653之BFS
Waiting ten thousand years for Love Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/3 ...
- HDU 2653 (记忆化BFS搜索+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但 ...
- AssetBundle loading failed because.....已解决
http://blog.csdn.net/ldghd/article/details/9632455 ***************************** 一 ******* ...
- 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句&倒装句(Reduced Clauses、Inverted Sentences) 【完结】
[英语魔法俱乐部——读书笔记] 3 高级句型-简化从句&倒装句(Reduced Clauses.Inverted Sentences):(3.1)从属从句简化的通则.(3.2)形容词从句简化. ...
- sentence patterns
第四部分 推理题 1.世界上每个角落的每个人都有立场,都有背景,都有推理性,能推理出一个人语言的真意,才成就了真正的推理能力: 2.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...
随机推荐
- 关于Xcode6 Segue 的疑问,没有解决!
xcode6 的segue 变化了,如图 关于前3个选项,始终没有太明白,我试验结果如下,简单地把几个viewController连接起来时,无论用show,还是showdetail,还是Presen ...
- 【USACO】pprime
开始看第一眼题就觉得问题会在超时上,果然写了个小代码运行到test 9时超时了 #include <stdio.h> #include <math.h> int isprime ...
- iphone越狱还原
在Cydia 里安装Impactor 就行了 .在操作时需要全程联网: .请至少保证 % 的电量以防止在恢复过程出现断电的情况(建议将设备连接至电源): .设备将恢复至出厂状态,所有用户数据都将被清除 ...
- JQZoom 图片放大插件的使用
QZoom是一个基于最流行的jQuery的图片放大器插件.它功能强大,使用简便.支持标准模式.反转模式.无镜头.无标题的放大,并可以自定义jQZoom的窗口位置和渐隐效果,修正IE6的select b ...
- C# Window Form解决播放amr格式音乐问题
最近搞一个项目,需要获取微信端语音文件,下载之后发现是AMR格式的录音文件,这下把我搞晕了,C#中的4种播放模式不支持播放AMR,想到都觉得头痛,如何是好?最后找到的方案,其实也简单:windows ...
- wp8
请问如何在应用内跳转到 显示 来自XX的更多应用? Windows.System.Launcher.LaunchUriAsync(new Uri("zune:search?pu ...
- Struts2标签实现for循环
感悟:但是不建议使用这种方法,按照MVC框架的思想 ,应该把业务更多放在后台.前台尽量只进行数据展示. 转自:http://blog.csdn.net/guandajian/article/detai ...
- C++的那些事:类的拷贝控制
1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象 ...
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)码农网
17. 安装 Webmin Webmin 是基于 Web 的 Linux 配置工具.它像一个中央系统,用于配置各种系统设置,比如用户.磁盘分配.服务以及 HTTP 服务器.Apache.MySQL 等 ...
- 前端JSON使用总结
JSON: JavaScript Object Notation(JavaScript 对象表示法)的简称. 1. 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaS ...