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.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...
随机推荐
- 64. 海明距离(Hamming Distance)
[本文链接] http://www.cnblogs.com/hellogiser/p/hamming-distance.html [介绍] 在信息领域,两个长度相等的字符串的海明距离是在相同位置上不同 ...
- 【转】Duplicate Elimination in Scrapy
本文转载自:http://blog.pluskid.org/?p=381 之前介绍 Scrapy 的时候提过 Spider Trap ,实际上,就算是正常的网络拓扑,也是很复杂的相互链接,虽然我当时给 ...
- Windows下的cmd命令行中设置环境编码
我们都知道,Windows下的cmd命令行默认编码是Windows系统的编码,就是ANSI编码或者说是GBK编码的,这样我们编写的很多应用比如php编写utf-8编码的应用在命令行下面运行时都会出现乱 ...
- Java for LeetCode 141 Linked List Cycle
Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...
- Java for LeetCode 032 Longest Valid Parentheses
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- Codeforces 389B(十字模拟)
Fox and Cross Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submi ...
- Java操作Session与Cookie
1,Java操作Session Java操作Session非常简单,步骤如下 1.1,在servlet中通过request获取session HttpSession session = request ...
- July 16th, Week 29th Saturday, 2016
A long road tests a horse's strength and a long task proves a man's heart. 路遥知马力,日久见人心. Do you have ...
- Jam的计数法(codevs 1140)
题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用 ...
- makefile_2
我们的工程有 8 个 C 文件,和 3 个头文件,我们要写一个 Makefile 来告诉 make 命令如何编译和链接这几个文件.我们的规则是:1)如果这个工程没有编译过,那么我们的所有 C 文件都要 ...