BDFZOI bdfz历险记

难度:提高-

题目类型:BFS

提交次数:2

涉及知识:BFS

描述

公主又又又被大魔王抓走啦!这次公主被困在一个叫做“bdfz”的迷宫里,作为勇者的你必须穿越这个迷宫才能找到公主。在迷宫中除了有道路和墙壁,你还会遇到各种各样的事件,影响你的血量,并且同一事件可以反复触发,例如:

‘1’:起太晚上学迟到,血量-1

‘2’:考太差惨遭嘲讽,血量-2

‘5’:上课睡着没听课,血量-5

‘X’:导师约谈,血量+1

‘Y’:幡然悔悟,血量+5

假设进入迷宫时你的起始血量为L,每移动1个位置需要1单位时间,若血量减至<=0,则需要原地回血直到血量为正值,1单位时间可以回复1点血量。血量上限为100(即血量不会超过100)。

输入第一行3个整数N,M,L(N,M,L<=50)
随后N行,每行有M个字符。字符的意义如下:
‘.’:道路
‘a’:公主
‘@’:勇者起始位置
‘#’:墙壁
‘1’:起太晚上学迟到,血量-1
‘2’:考太差惨遭嘲讽,血量-2
‘5’:上课睡着没听课,血量-5
‘X’:导师约谈,血量+1
‘Y’:翻然悔悟,血量+5输出如果能救出公主,输出最短时间;否则输出"Impossible"样例输入

样例1:
6 8 2
....Y...
[email protected]#2.
.##.51..
.X#.#...
...X51..
...##a..

样例2:
6 8 2
YYY##...
[email protected]#2.
####55#.
.X#.#5#.
...Y55#.
...##a..

样例输出

样例1:
10

样例2:
15

代码:
 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 #include<cstdio>
 5 using namespace std;
 6 int n, m, l;
 7 char map[60][60];
 8 bool visited[60][60][60];
 9 int dirx[4]={1,-1,0,0};
10 int diry[4]={0,0,1,-1};
11
12 struct node{
13     int x, y;
14     int time, blood;
15     node(int xx, int yy, int tt, int bb): x(xx),y(yy),time(tt),blood(bb){}
16 };
17
18 bool operator<(const node&n1, const node&n2){
19     return n1.time>n2.time;
20 }
21
22 bool judge(int x, int y){
23     if(map[x][y]!=‘#‘ && map[x][y]!= 0)
24         return true;
25     else
26         return false;
27 }
28 int chb(char a){
29     if(a==‘.‘||a==‘@‘||a==‘a‘) return 0;
30     if(a==‘X‘) return 1;
31     if(a==‘Y‘) return 5;
32     else return -(a-‘0‘);
33 }
34 priority_queue<node>pq;
35
36 int main(){
37     cin>>n>>m>>l;
38     int i, j;
39     memset(visited,0,sizeof(visited));
40     for(i = 1; i <= n; i++)
41         for(j = 1; j <= m; j++){
42             cin>>map[i][j];
43             if(map[i][j]==‘@‘){
44                 pq.push(node(i,j,0,l));
45                 visited[i][j][l] = true;
46             }
47         }
48
49     bool flag = false;
50     while(!pq.empty()){
51         node no = pq.top();
52         pq.pop();
53 //        cout<<no.x<<" "<<no.y<<" "<<no.blood<<" "<<no.time<<":"<<endl;
54         if(map[no.x][no.y]==‘a‘){
55             cout<<no.time<<endl;
56             flag = true;
57             break;
58         }
59
60         else{
61             for(i = 0; i < 4; i++){
62                 int nx = no.x+dirx[i];
63                 int ny = no.y+diry[i];
64                 int nb = no.blood + chb(map[nx][ny]);
65                 int deltatime = 0;
66                 if(nb <= 0){
67                     deltatime = 0-nb+1;
68                     nb = 1;
69                 }
70     //            cout<<visited[nx][ny][nb]<<" "<<judge(nx,ny)<<endl;
71
72                 if(!visited[nx][ny][nb]&&judge(nx,ny)){
73         //            cout<<nx<<" "<<ny<<" "<<nb<<" "<<no.time+1+deltatime<<endl;
74                     pq.push(node(nx,ny,no.time+deltatime+1,nb));
75                     visited[nx][ny][nb] = true;
76                 }
77             }
78         }
79     //    getchar();
80     }
81     if(!flag) cout<<"Impossible"<<endl;
82     return 0;
83 } 

备注:

多维BFS,加一个关于血量的参数。没血之后要花时间(deltatime)原地回血。chb函数是change the blood,这个函数里没有把所有地形都定义全(终点血量乱了),导致查了一个小时的错误。。

第二个错误是没写deltatime,直接把正在扩展的no.time给改了,这样肯定就不对了。。

时间: 2024-10-05 04:58:13

BDFZOI bdfz历险记的相关文章

蜗牛历险记(二) Web框架(中)

上篇简单介绍了框架所使用的Autofac,采用Autofac提供的Ioc管理整个Web项目中所有对象的生命周期,实现框架面向接口编程.接下来介绍框架的日志系统. 一.介绍之前 框架日志是否有存在的必要性?假如你认为你的框架永远不会出现Bug,或者你能根据错误提示就能还原现场,重现这个问题,那你不需要日志.目前看来这样的项目不存在(Helloworld之类除外).因此日志框架还是很必要的. 日志框架用于记录:系统运行过程中错误详情:用于记录系统使用过程中产生的意外情况:用于记录系统一些状态信息等等

Git历险记(一)

[编者按]作为分布式版本控制系统的重要代表——Git已经为越来越多的人所认识,它相对于我们熟悉的CVS.SVN甚至同时分布式控制系统的 Mercurial,有哪些优势和不足呢.这次InfoQ中文站有幸邀请到<Git Community Book>的译者刘辉,在InfoQ开辟<Git历险记>专栏,分享他使用Git的经验,以及他对Git的看法. Git是Linus.Torvald为了管理Linux内核发起并开发的一个开源分布式版本控件系统(DVCS).从2002年起,Linux 内核一

Git历险记(四)——索引与提交的幕后故事

我想如果看过<Git历险记>的前面三篇文章的朋友可能已经知道怎么用git add,git commit这两个命令了:知道它们一个是把文件暂存到索引中为下一次提交做准备,一个创建新的提交(commit).但是它们台前幕后的一些有趣的细节大家不一定知晓,请允许我一一道来. Git 索引是一个在你的工作目录(working tree)和项目仓库间的暂存区域(staging area).有了它, 你可以把许多内容的修改一起提交(commit). 如果你创建了一个提交(commit),那么提交的一般是暂

Git历险记(二)——Git的安装和配置

各位同学,上回Git历险记(一)讲了一个 “hello Git” 的小故事.有的同学可能是玩过了其它分布式版本控制系统(DVCS),看完之后就触类旁通对Git就了然于胸了:也有的同学可能还如我当初入手Git一样,对它还是摸不着头脑. 从这一篇开始,我就将比较“啰嗦”的和大家一起从零开始经历Git使用的每一步,当然对我而言这也是一个重新认识Git的过程. 使用Git的第一步肯定是安装Git,因为在多数平台上Git是没有预装的.我平时主要的工作环境是windows和Linux(ubuntu),我想看

QA队长历险记(二)

? 滴--滴--滴--一边的锅炉上冷凝水溅到了冰凉的水泥地上.Oliver从一直散发辐射的笔记本电脑屏幕前抬起头,但依稀只看到一片阴影.Seymour Profits,Oliver在G.Wizkins软件公司的新老板,深夜在地下室会议召见了他,他奉命带上他的笔记本电脑和他一直在做的公司最新的移动应用程序的更改."晚上好,Oliver."属于他人的声音让Oliver吓得跳了起来.Profits先生慢悠悠地走出阴影,走到Oliver正坐着的小桌子边."我知道你只来了一个星期,所以

独步天下的创业历险记6-论产品的创意

这次鄙人讨论一下产品的创意这个话题,坦率的讲,区区对这个话题情有独钟,因为这个话题比较宽,比较泛,可以天马行空,上天入地,无所不能:亦能够别出心裁,践行于微.但凡面对做什么产品,弄怎样的创意,每个人有每个人的看法,有自己的行事作风,林林总总,不一而足.这,便是做产品创意的魅力之所在. 怎么做一个产品创意?你可以谨慎地选择,小心的求证,掌握世界上最经典的生产实践理论,结合各种专家的各种分析预测,站在巨人的肩膀上,然后根据自身的实际能力,做一个稳妥的,可行性良好的,市场前景广阔的产品创意,这便是区区

独步天下的创业历险记-论产品的灵性

作为一个软件工程师.也许你认为自己掌握了很多技术,理论上讲,你是可以开发出很多产品的,说的直白点就是,这个世界上有的软件应该都能做出来吧!事情往往没那么简单.你虽然掌握了足够的技术,但是,这并不意味着,你就可以作出有用的产品.产品的价值是市场决定,是用户决定,而不是技术决定,更不是工程师决定的.这是我话题的起点.     技术是可以学习的,他很理性,同时也循规蹈矩,现在说软件技术,只要不太笨的人,投入足够多的时间,一般都是能掌握的.这个世界上有一类人,他们创造技术,我们绝大多数人,只需要学习他们

Ubuntu13.04安装历险记--新人新手新作

----Ubuntu13.04安装历险记--新人新手新作------------------------------------------------- 注:以下操作均省略权限获取操作,如有需要,请sudo先获取权限 -----0.源变更-------------------------(1) 备份cp /etc/apt/sources.list /etc/apt/sources.list_backup -----1.卸载apache2-------------------------(1)

【Swift】iOS开发小坑历险记(二)

前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 1.用动画更新约束没有动画效果? 缺少 layoutIfNeeded ,事例: UIView.animateWithDuration(0.15, animations: { () -> Void in self.heightConst