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.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...
随机推荐
- 解决虚拟机 正在决定eht0 的ip信息失败 无链接-- 添加虚拟网卡
添加步骤:1.进入设备管理器 2.点下一步3.继续下一步 4.继续往下走
- hdu 1113 Word Amalgamation 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1113 题意:输入一个字典,然后再输入若干单词(每行中,1 <= 单词数 <= 100,并且 ...
- July 22nd, Week 30th Friday, 2016
Love means never having to say you are sorry. 爱就是永远不必说对不起. Love means knowing each other deeply, the ...
- Unix系统编程_cha11.6_线程同步
#include <stdio.h>#include <pthread.h>#include <stdlib.h> #define NHASH 29#define ...
- Codeigniter CRUD代码快速构建
一个与数据库操作打交道的应用,必然涉及到数据的添加.修改.删除等操作.因此CRUD操作几乎成为每个后台管理站点的必备功能.数据库的复杂性,导致PHP操作代码也会有不少的冗余,因此,如果可以有工具自动生 ...
- oracle中merge的详解
Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的 ...
- Java封装自己的Api
转自:http://www.2cto.com/kf/201404/291555.html 随着学习的深入,我们都想封装自己的Api,但对于新手这并不是一件简单容易的事! 我要达到的效果:自己封装一些方 ...
- MATLAB学习笔记(八)——MATLAB数值积分与微分
(一)数值积分 一.数值积分的MATLAB实现方法: 1.变步长辛普生法(quad)法: (1)调用格式: [I,n]=quad('fname',a,b,tol,trace); fname是被积函数: ...
- 解决:jquery-1.11.1.min.js红叉问题
工程中导入jquery-1.11.1.min.js,工程正常运行.但是jquery-1.11.1.min.js一直显示红叉. 解决方法如下: 红叉的原因是:myeclipse没有去验证它! 选中js文 ...
- 【xml 报错】xml编译错误
---恢复内容开始--- 有时候在xml文件中,特别是于Spring相关的配置文件中,会出现一些不影响程序正常运行的编译错误,如: Referenced file contains errors (h ...