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.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...
随机推荐
- iOS 中使用类别简化代码开发
最近需要一个函数,把CLLocation对象转化为NSDictionary,按照我以前的想法,我会写一个工具类,之后添加一个函数,类似这样 - (NSDictionary *)turnLocation ...
- JavaScript设计模式 - 迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...
- struts2中各种值栈问题
struts2中OGNL和 ValueStack(一) 收藏 学习的时候,总分不清楚在struts2中页面的传值和取值是怎么来完成的,所以从网上搜了很多资料,现在把这些资料总结写,留着以后参考..看完 ...
- Rational Rose2007(v7.0)下载地址、安装及激活详解教程(图)
http://blog.csdn.net/skl_tz/article/details/8925152 最近需要画uml图,之前用的是Rose 2003版的,由于好久没进去了,结果发现原来的激活又失效 ...
- 个人电脑配置FTP服务器,四张图搞定。项目需要,并自己写了个客户端实现下载和上传的功能!
测试结果:
- 【JSP jstl c标签】使用c:foreach 报错(警告)”test does not support runtime expressions“
后台封装的数据是个list,传递给前台,显示如下: <c:forEach items="${userInfo}" var="user"> 用户Nam ...
- Oracle生成千万测试数据
oracle 生成千万测试数据 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试 ...
- node基础 --全局
全局对象: global:永远使用var 定义变量以避免引入全局变量; process:所有全局执行上下文的内容都在process对象中: 模块和包: 模块:一个Node.js 文件就是一个模块,这个 ...
- js:数据结构笔记2---列表
列表: 定义:一组有序的数据: function List() { this.listSize = 0; this.pos = 0; this.dataStore = []; this.find = ...
- AppleWatch开发教程之调试程序使用帮助文档
AppleWatch开发教程之调试程序使用帮助文档 AppleWatch开发教程之调试程序 调试又被称为排错,是发现和减少程序错误的一个过程.在Xcode中进行调试的需要实现以下几个步骤: 1.添加断 ...