被这道题坑到了,如果单纯的模拟题目所给的步骤,就会出现同一个位置要走两次的情况。。。所以对于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的更多相关文章

  1. HDU 2653 - Waiting ten thousand years for Love

    首先,对于一个 '@' 飞上去,飞下来都要耗1点魔力,所以是两点= = 然后站在同一格 魔力可能不同,所以要增加一维. 还有当前搜到的不一定是最小. 别的也没啥. #include <iostr ...

  2. hdu 4541 Ten Googol

    http://acm.hdu.edu.cn/showproblem.php?pid=4541 打表找规律 #include <cstdio> #include <cstring> ...

  3. hdu-2619 Love you Ten thousand years

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2619 题目大意: 求出小于n的数的个数,满足ki mod n,1≤i≤n是模n的完全剩余系 解题思路 ...

  4. HDU2653 BFS+优先队列

    Waiting ten thousand years for Love Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/3 ...

  5. hdu2653之BFS

    Waiting ten thousand years for Love Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/3 ...

  6. HDU 2653 (记忆化BFS搜索+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但 ...

  7. AssetBundle loading failed because.....已解决

    http://blog.csdn.net/ldghd/article/details/9632455 *****************************      一      ******* ...

  8. 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句&倒装句(Reduced Clauses、Inverted Sentences) 【完结】

    [英语魔法俱乐部——读书笔记] 3 高级句型-简化从句&倒装句(Reduced Clauses.Inverted Sentences):(3.1)从属从句简化的通则.(3.2)形容词从句简化. ...

  9. sentence patterns

    第四部分     推理题 1.世界上每个角落的每个人都有立场,都有背景,都有推理性,能推理出一个人语言的真意,才成就了真正的推理能力: 2.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...

随机推荐

  1. python基础——切片

    python基础——切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', ...

  2. 希尔排序( Shell Sort)

    原文地址:http://www.stoimen.com/blog/,在此感谢作者! Insertion sort is a great algorithm, because it’s very int ...

  3. Android之数据库操作

    安卓数据库帮助类 /** * 数据库帮助类,用于管理数据库 * @author Administrator * */ public class PersonSQLiteOpenHelper exten ...

  4. 学习hadoop,搭建hadoop遇到一些特殊问题

    我执行下面步骤: 1.  动态增加DataNode节点和TaskTracker节点 以host9为例 在host9上执行: 指定主机名 vi  /etc/hostname 指定主机名到IP地址的映射 ...

  5. 使用jquery制作可视化的组织结构

    组织结构是做项目里面经常用到的,但是要做成可视化的效果比较少,多数使用树结构来表示,但是对于客户来说不是太直观.可以用jOrgChart来实现.如下图的效果,这样就比较直观. 首先你要去下载jOrgC ...

  6. 第六步:Lucene查询索引

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  7. PHP生成不重复随机数的方法

    无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下. 方法一: ...

  8. mingw64环境搭建

    转自:http://www.cr173.com/soft/132367.html MinGW64位版,默认编译出来是64位的,需要编译32位请使用-m32 参数!mingw是一款gnu工具集合是Min ...

  9. Android Touch事件传递机制解析

    android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEven ...

  10. WinForm窗体间传值

    1.通过构造函数 特点:传值是单向的(不可以互相传值),实现简单 实现代码如下: 在窗体Form2中 int value1; string value2; public Form2 ( int val ...