炸僵尸

题目描述

妈妈得知小星星成功地解决了买玩具难题,奖励他去看电影《生化危机 6》, 小星星看 着看着就替女主角担心起来了,因为她要对付那么多的僵尸怪物,小星星恨不得扔颗炸弹消 除可恶的僵尸们,他脑袋里开始构思出这样的场景:
这里写图片描述
在一个 N 行 M 列单元格构成的地图中,去放置一个炸弹,这种炸弹威力巨大,以放置 点为中心进行行列延伸炸到同行同列的僵尸,但不能穿墙。上图中可以把炸弹放置在第 3 行第 4 列,最多可以炸到 4 个僵尸,如果对地图稍加改动(如下图),在第 5 行第 4 列处加 入一个墙体,又如何呢?答案还是最多炸到 4 个僵尸,只不过最佳炸弹放置点发生了变化, 应该放到第 6 行第 6 列的位置。
这里写图片描述
当然炸弹要靠勇敢的小星星去放,他只能在地图中朝上下左右四个方向行进(不能斜对 角移动) ,他不能穿墙,也不能穿越僵尸,要保证他的安全,如下图,告诉你小星星起始位 置是第 2 行第 2 列,那么他的最佳放置炸弹位置应该是第 3 行第 2 列,最多炸到 2 个僵尸。
这里写图片描述
现在请聪明的你也一起加入到消除僵尸的队伍来。

输入

第一行四个用空格隔开的正整数表示 N,M,X,Y,分别表示 N 行 M 列的地图,小星星起 始位置第 X 行,第 Y 列。接下来 N 行 M 列用来描述地图上每个单元格,‘ G’表示僵尸,‘#’表示墙体,只有‘.’ 表示的单元格才是小星星能够正常行走,能够放置炸弹的单元格。(数据保证四面都是墙体, 也就是第 1 行、第 N 行、第 1 列、第 M 列肯定都是墙体)。

输出

一个整数,最多能炸掉的僵尸数量。

样例输入

13 13 4 2

#

..GG#GGG.

.#G#G#G#G

…….#..G

G#.###.#G#G

13 13 4 2

#

..GG#GGG.

.#G#G#G#G

…….#..G

G#.###.#G#G

GG.GGG.#.GG

G#.#G#.#.#.

G…G…..

G#.#G###.#G

…G#GGG.GG

G#.#G#G#.#G

GG.GGG#G.GG

#######

(CSDN编辑器的问题,不要在意)

样例输出

10

数据范围限制

30%的数据,保证 N,M<14,并且小星星一定能够抵达最佳炸弹放置点
40%的数据,保证 N,M<14
70%的数据,保证 N,M<101
100%的数据,保证 N,M<2001
100%的数据,保证 X

思路:

其实比赛时就已经想到了,要预处理+搜索
但是比赛时图方便,随手打了个深搜
结果,运行时错误70
后来发现:只能用宽搜打,深搜会炸~!!

代码:

var
        n,m,i,j,k,x,y,z,s,ls:longint;
        st:ansistring;
        a:array[0..2002,0..2002]of char;
        f:array[0..2002,0..2002,1..4]of longint;
        b:array[0..2002,0..2002]of boolean;
        o:array[1..4,1..2]of longint=((-1,0),(0,1),(1,0),(0,-1));
        d:array[0..10000001,1..2]of longint;
begin
        assign(input,'boom.in');
        reset(input);
        assign(output,'boom.out');
        rewrite(output);
        readln(n,m,x,y);
        for i:=1 to n do
        begin
                readln(st);
                for j:=1 to m do
                a[i,j]:=st[j];
        end;
        for i:=1 to n do
        for j:=1 to m do
        if (a[i,j]='G')or(a[i,j]='.') then
        begin
                if a[i-1,j]='G' then f[i,j,1]:=f[i-1,j,1]+1
                else f[i,j,1]:=f[i-1,j,1];
        end;
        for i:=n downto 1 do
        for j:=1 to m do
        if (a[i,j]='G')or(a[i,j]='.') then
        begin
                if a[i+1,j]='G' then f[i,j,2]:=f[i+1,j,2]+1
                else f[i,j,2]:=f[i+1,j,2];
        end;
        for i:=1 to n do
        for j:=1 to m do
        if (a[i,j]='G')or(a[i,j]='.') then
        begin
                if a[i,j-1]='G' then f[i,j,3]:=f[i,j-1,3]+1
                else f[i,j,3]:=f[i,j-1,3];
        end;
        for i:=1 to n do
        for j:=m downto 1 do
        if (a[i,j]='G')or(a[i,j]='.') then
        begin
                if a[i,j+1]='G' then f[i,j,4]:=f[i,j+1,4]+1
                else f[i,j,4]:=f[i,j+1,4];
        end;
        i:=0;
        j:=1;
        d[1,1]:=x;
        d[1,2]:=y;
        b[x,y]:=true;
        while i<j do
        begin
                inc(i);
                x:=d[i,1];
                y:=d[i,2];
                if f[x,y,1]+f[x,y,2]+f[x,y,3]+f[x,y,4]>s then
                begin
                        s:=f[x,y,1]+f[x,y,2]+f[x,y,3]+f[x,y,4];
                end;
                for k:=1 to 4 do
                if (x+o[k,1]>0)and(x+o[k,1]<=n)and(y+o[k,2]>0)and(y+o[k,2]<=m)and(a[x+o[k,1],y+o[k,2]]='.')and(b[x+o[k,1],y+o[k,2]]=false) then
                begin
                        inc(j);
                        d[j,1]:=x+o[k,1];
                        d[j,2]:=y+o[k,2];
                        b[x+o[k,1],y+o[k,2]]:=true;
                end;
        end;
        writeln(s);
end.
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: “僵尸博士 scratch”是指《植物大战僵尸》这款经典的手机游戏中的一个角色。scratch被描绘成一个博士,穿着破烂的白大褂,脸色苍白,眼神空洞,干瘪的皮肤上布满了伤痕。 scratch迷失了自己的记忆,对过去的经历一无所知,只记得他是一名科学家。他痴迷于研究僵尸和植物之间的相互作用,试图找到一种平衡的解决方案。然而,在研究的过程中出了问题,导致他成为了一个僵尸。 尽管成为僵尸,scratch仍然保持着他原来的智慧和科学家的思维模式。他通过继续研究,发现了僵尸和植物之间的一些奇妙的相互作用。他创造了一种新的僵尸,这种僵尸获得了类似植物的能力,可以自行生长和攻击。 scratch的研究成果引起了其他僵尸的注意,同时也引起了植物阵营的警觉。他们都对scratch的研究成果感到好奇,并试图掌握这种力量。然而,scratch并不打算把这种力量暴露给外界,他只是想用它来找回自己的记忆。 作为一个僵尸博士的角色,scratch展现了追求知识的热情和对科学的信仰。尽管他成为了僵尸,但他没有放弃寻求真相和解决问题的愿望。他的故事也提醒了我们,无论遇到什么困难,保持积极的心态和坚持不懈地追求目标,是克服困难的关键。 ### 回答2: 「僵尸博士 Scratch」是一个流行的角色,出现在电视节目、电影和游戏中。他是一个幽默、搞怪的僵尸科学家,以其古怪的外表和行为风格而受到观众的喜爱。 Scratch博士的造型是一个典型的僵尸形象,他穿着破烂的实验室大衣和破旧的围裙,头上戴着疯狂的发型,皮肤呈绿色,眼睛通红。他有着夸张的表情和动作,总是带着一副邪魅的笑容。这使得他成为一个独特、有趣的角色。 作为一个僵尸科学家,Scratch博士以进行各种怪异的实验而闻名。他的实验室里到处都是奇怪的瓶瓶罐罐,他总是热衷于研究如何使僵尸更强大或找到复活的方法。虽然他的实验经常失败,但他总是能从失败中学到经验教训,并通过自己的幽默谈话和活泼的性格来调整心态。 Scratch博士在剧中经常和其他角色互动,他的幽默感和诙谐的对话总是能带给观众欢乐。同时,他的角色也传达了一个关键的信息,即外表和常规的期望并不能完全定义一个人。虽然Scratch博士是一个看起来可怕的僵尸,但他却充满了乐观和创造力。 总的来说,「僵尸博士 Scratch」是一个深受观众喜爱的角色,他的独特外表、古怪的行为和幽默的对话使得他在各种媒体中成为一个独特而有吸引力的存在。他向我们展示了无论外表如何,每个人都有自己的独特之处,并且应该拥有乐观的态度和创造力来面对生活中的挑战。 ### 回答3: 僵尸博士Scratch是一位聪明而有才华的僵尸科学家。Scratch以他极高的智商和广泛的知识基础而闻名,他对与僵尸有关的一切事物都有着深入的研究和理解。 Scratch一直致力于解开僵尸生物学和医学的谜题。他的研究主旨是探寻如何恢复僵尸身体的活力和恢复原本的人类状态。他深信,以科学的方法,可以摆脱僵尸状态,重新加入人类社会。为了达到这个目标,Scratch进行了许多实验和研究。 他的研究范围包括僵尸大脑的功能和影响因素、僵尸血液中的化学物质以及身体组织的变化等等。他一直在寻找能够抑制僵尸进食欲望和恢复代谢的方法。通过这些努力,他希望能够让僵尸拥有更加正常的生活方式,并最终实现重获人类身份的目标。 除了在实验室里的工作,Scratch还广泛阅读相关文献和参加学术会议。他积极与其他科学家合作,分享和交流研究成果。他希望通过与其他领域的专家合作,找到更有效的治疗方法,以帮助所有的僵尸恢复正常人类状态。 尽管他的研究进展良好,Scratch也面临许多困难和挑战,比如公众观念的改变和道德伦理问题。然而,他相信只要坚持下去,继续努力,一定能够为所有的僵尸带来转机。 Scratch是一个为他的理想而奋斗的科学家,他的研究对于僵尸社会来说具有重要的意义。通过他的努力,我们可以期待未来,人类和僵尸之间的和谐共存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值