死亡洞穴(cave)

2024-03-04 07:38
文章标签 cave 死亡 洞穴

本文主要是介绍死亡洞穴(cave),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目背景
在 caima 的 RPG 游戏中,控制着两个人 VV 和 JJ。 这次 VV 和 JJ 掉入了一个死亡洞穴,洞穴是一个 N*M 的矩阵。之所以称之 为死亡洞穴,是因为在这个矩阵中有一些死亡十字。(如下图中的+)

.+++.
.+.+.
V+.J+
由于 VV 和 JJ 被分撒在了两地,而 JJ 还受了重伤,你需要让 VV 赶到 JJ 所 在的地方。为了尽量少的受死亡十字的影响,VV 要尽量远离这些死亡十字。 我们定义洞穴中两个格子(x,y)和(x’,y’)之间的距离为: 也就是说,我们要使得 VV 再去找 JJ 的路上,离任意死亡十字的距离都尽 可能的远。VV 每次可以往一个格子的上下左右四个方向走一格。 现在你需要写个程序,来计算最好情况下离死亡十字最近的距离。

题目描述
输入输出格式
输入格式:
第一行两个整数 N 和 M,表示矩阵规模。 接下来 N M 列,描述这个洞穴的情况。其中 V 表示 VV 所在的位置; J 表示 JJ 所在的位置; . 表示空地;

表示死亡十字。
输出格式:
一行一个数字,表示 VV 在去找 JJ 的路上,最好情况下离死亡十字最近的距 离。

输入输出样例
输入样例
4 4
+…


V…J
输出样例
3
说明
对于 30% 的数据 N,M≤50。 对于 100% 的数据 N,M≤500。

看完题目感觉无从下手,在教练的一番指点后才发现这居然是一道二分答案+bfs。
思路:二分最近的十字架距离,再bfs判断是否可以。本题考点主要在于想出二分和如何bfs。
代码:

const z:array[1..4,1..2]of -1..1=((1,0),(-1,0),(0,1),(0,-1));
var i,j,k:longint;m,n,h,t:longint;ch:char;fx,fy,lx,ly:longint;l,r,mid,ans:longint;a:array[0..501,0..501]of longint;b,p:array[0..501,0..501]of boolean;x,y,u:array[0..1000000]of longint;
function bfs(min:longint):boolean;//bfs也就是二分中的check
var i:longint;
beginp:=b;h:=1;t:=1;x[1]:=fx;y[1]:=fy;p[x[1],y[1]]:=false;if (fx=lx) and (fy=ly) then exit(true);//可以到终点repeatfor i:=1 to 4 doif p[x[t]+z[i,1],y[t]+z[i,2]] and (a[x[t]+z[i,1],y[t]+z[i,2]]>=min) then//满足距离条件begininc(h);x[h]:=x[t]+z[i,1];y[h]:=y[t]+z[i,2];p[x[h],y[h]]:=false;if (x[h]=lx) and (y[h]=ly) then exit(true);end;inc(t);until t>h;exit(false);//不可以到终点
end;
beginread(m,n);readln;h:=0;t:=1;for i:=1 to m dobeginfor j:=1 to n dobeginread(ch);if ch='V' then begin fx:=i; fy:=j; end;if ch='J' then begin lx:=i; ly:=j; end;if ch='+' then begin inc(h); x[h]:=i; y[h]:=j; b[i,j]:=false; a[i,j]:=0; u[h]:=0; endelse b[i,j]:=true;end;readln;end;p:=b;//给每个位置标记上距离,利用bfs必定先找到最优解repeatfor i:=1 to 4 doif p[x[t]+z[i,1],y[t]+z[i,2]] thenbeginp[x[t]+z[i,1],y[t]+z[i,2]]:=false;inc(h);x[h]:=x[t]+z[i,1];y[h]:=y[t]+z[i,2];u[h]:=u[t]+1;a[x[h],y[h]]:=u[h];end;inc(t);until t>h;l:=1;r:=a[fx,fy];if a[lx,ly]<r then r:=a[lx,ly];//最大必定不比起点和终点的小的值大while l<=r do//二分beginmid:=(l+r) div 2;if bfs(mid) then begin l:=mid+1; ans:=mid; {记录答案}end else r:=mid-1;end;write(ans);//输出
end.

如果大家不明白

给每个位置标记上距离,利用bfs必定先找到最优解

则先做一下这题:
题目描述
给出一个N*M的01矩阵,求每个点离它最近的数字1的点的距离是多少。距离是曼哈顿距离。(平面上,坐标(x1, y1)的点P1与坐标(x2, y2)的点P2的曼哈顿距离为:|x1 - x2| + |y1 - y2|.)

输入格式:
第一行两个数N,M
后面N行,每行M个字符,为0或1

输出格式:
共输出N行,每行M个数,用空格分开。

输入输出样例
输入样例
3 4
0001
0011
0110
输出样例
3 2 1 0
2 1 0 0
1 0 0 1
说明
50%的数据,N,M<=100
100%的数据,N,M<=1000

这题便是上题目的一个简化题,题目更清晰。

代码:

const z:array[1..4,1..2]of -1..1=((1,0),(-1,0),(0,1),(0,-1));
var i,j,k:longint;m,n:longint;a:array[0..1001,0..1001]of longint;b:array[0..1001,0..1001]of boolean;ch:char;h,t:longint;x,y,u:array[0..1000000]of longint;
beginh:=0;t:=1;readln(m,n);for i:=1 to m dofor j:=1 to n dob[i,j]:=true;for i:=1 to m dobeginfor j:=1 to n dobeginread(ch);if ch='1' then//如果为1则入队列beginb[i,j]:=false;a[i,j]:=0;inc(h);u[h]:=0;x[h]:=i;y[h]:=j;end;end;readln;end;repeat//根据bfs的性质可得第一个找到的便是那一个0距离最近的一个1的距离。for i:=1 to 4 doif b[x[t]+z[i,1],y[t]+z[i,2]] thenbegininc(h);x[h]:=x[t]+z[i,1];y[h]:=y[t]+z[i,2];u[h]:=u[t]+1;b[x[h],y[h]]:=false;a[x[h],y[h]]:=u[h];end;inc(t);until t>h;for i:=1 to m do//输出便可beginfor j:=1 to n do write(a[i,j],' ');writeln;end;
end.

这篇关于死亡洞穴(cave)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/772474

相关文章

cocos2d-x 如何使用CCProgressTimer作为血条,实现跟随怪物进行移动,自动掉血,然后死亡。

Cocos2d-x中类CCProgressTimer实现游戏人物血条 一、CCProgressTimer的基本使用步骤: cocos2d-x的进度条函数CCProgressTimer,我们可以这样定义: 1. //s_pPathSister1为图片的路径 2. CCProgressTimer *left = CCProgressTimer::create(

美国一男子伪造死亡逃避抚养义务,获刑六年

为了逃避抚养子女的责任,美国肯塔基州一名39岁的男子Jesse Kipf(杰西·基普夫)竟然采取极端的手段,非法侵入夏威夷的死亡登记系统,通过盗取的登录信息篡改个人记录,将自己伪造成已故状态。 据BleepingComputer报道,Jesse在2023年1月,利用远程操控一名居住于另一州的医生账户,成功访问了该系统,并精心伪造了一份以该医生为医疗证明人的个人死亡证明,还利用医生的数字签名完成了

【Mac】精通或死亡Spellz Mastery or Death(角色扮演游戏))游戏介绍

前言 今天给大家介绍一款游戏,《精通或死亡Spellz Mastery or Death for mac》(角色扮演游戏) 。 游戏介绍 《精通或死亡:Spellz Mastery or Death》是一款以魔法为核心的策略角色扮演游戏(RPG),玩家在游戏中需要掌握各种魔法技能,并通过巧妙运用这些技能来战胜敌人和克服挑战。以下是对这款游戏的详细介绍: 游戏背景 《精通或死亡》的故事发生

只有死亡和税收是不可避免的…

原文地址:只有死亡和税收是不可避免的——国家为什么要征税 作者:追求石全石美人   只有死亡和税收是不可避免的——国家为什么要征税 西方人曰:“只有死亡和税收是不可避免的”。过去,我们对这种说法难以理解,认为税收距离自己是相当遥远的事。然而,这几年随着农业税取消、个人所得税自行申报、证券交易印花税税率的提高、房产买卖中税负的不断变化等各种涉税事件的频频出现,人们越来越感觉到,税收已

Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)

上期链接:Unity2D游戏制作入门 | 11(之人物属性及伤害计算)-CSDN博客 上期我们聊到了人物的自身属性和受伤时的计算,我们先给人物和野猪挂上属性和攻击属性的代码,然后通过触发器触发受伤的事件。物体(人物也好敌人也行)受伤时通常是在被攻击者的内部进行计算的(这是有好处的,比如使用人物更复杂的血量计算方式,我们在人物内部让它自己自动计算就好了),我们使用关键词this来将Attacker

Java面试题:解释一下Java中的线程状态转换,包括新建、就绪、阻塞、运行和死亡状态

在Java中,线程在其生命周期中会经历不同的状态。了解这些状态及其转换对于编写高效且无死锁的多线程程序至关重要。以下是Java线程的五个主要状态及其转换: 新建(New): 线程对象创建后,线程处于新建状态。此时,线程还未启动。 就绪(Runnable): 当线程对象调用了start()方法后,线程进入就绪状态。在就绪状态下,线程等待JVM调度并获得CPU时间片以便开始执行。新建状态的线程不

24-6-2-读书笔记(四)-《死亡的样板》and《布斯托斯·多梅克故事新编》豪尔赫·路易斯·博尔赫斯(第三辑)

文章目录 《死亡的样板》and《布斯托斯·多梅克故事新编》阅读笔记记录总结 《死亡的样板》and《布斯托斯·多梅克故事新编》   《死亡的样板》是一个剧本,《布斯托斯·多梅克故事新编》是一个小故事集合,简要记录,这两本书不是非常吸引我。 阅读笔记记录 《死亡的样板》 P37 眯着眼睛,龇着牙,下巴顶的高高的,呼吸平稳,双拳紧握,手臂弯折着,肘部灵活地抬到了规定的高度——这是

人从胚胎开始就要交税,直到死亡,是这样吗?

文章目录 梗概税收的基本概念从胚胎到死亡的税收分析胚胎到出生出生到成年成年到死亡 总结 梗概 人从胚胎阶段开始交税直到死亡,这个观点听起来有些戏剧化,但如果我们广义地理解“交税”这个概念,可以从不同的角度进行探讨。实际上,个人税收义务通常开始于能够进行经济活动和产生收入的年纪,而不是从胚胎阶段开始。 税收的基本概念 税收是国家依法向公民、法人和其他组织征收的一种强制性收入

【C语言每日题解】三题:回文检查、刘备 关羽 张飞三人过年放鞭炮、犹太人死亡游戏(难度up,推荐⭐✨)

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 🌈感谢大家的阅读、点赞、收藏和关注 🥰希望大家喜欢我本次的讲解 🌟非常推荐最后一道题 🌹 犹太人死亡游戏,建议观看 🌙目录 💕题目一:回文检查 🎉题目二:刘备、关羽、张飞过年放鞭炮 🌹题目三: 犹太人死亡游戏         所以我们要做的就是如何让数组中最后一个元素过了之后又来到开头的元素。 其次

全球首例!猪肾移植患者死亡,人类科技与伦理或将面临挑战?

全球首例猪肾移植患者的离世,如同一颗重磅炸弹,在医学界激起千层浪花,让原本充满希望的“死而复生”异种器官移植技术再次被推至风口浪尖。 今年3月,一场与命运的较量在麻省总医院悄然落幕。全球首位接受转基因猪肾移植的患者理查德·斯莱曼,这位曾经饱受双侧肾衰竭折磨的62岁老人,在经历了一场前所未有的手术后,终究未能战胜病魔,永远地闭上了眼睛。 ​斯莱曼的离世,不禁让人回想起两个月前同样令人扼腕叹