2021-07-27

【2.4递归调用6262(流感传染)】第一次发文讲解,偏基础一点啦,毕竟我也是小白,不过是自己的解法也可以说是想法吧,,毕竟网络上搜到的解法好像没我的好呐,主要也是想分享一下我的见解

(抱着伊蕾娜酱打字呐,软软哒)
咱先介绍下自己吧,毕竟第一次发文。。。。。。

本人高一一枚,就读于fz clyz。。九月份就是高二了,
在这之前从没写过文章。。之后可能没时间啦。。

c++爱好者哦,目前之拿下《信息学奥赛一本通》的大半,
《入门到入土》90%(网络通信之后的真心不知道他在讲什么,奇怪的代码出现了!)
昂昂没参加过奥赛,纯凭我一腔热血。。。。。。

呢么步入正题!
————————————————————————————————————
————————————————————————————————————

最近看到一道题,网上查了的答案非常yin jian。。。什么四维五维数组都出来了。。。
<方法纯属个人观点,可能不是大家心里最好的鸭,求求了给个过叭>

so 先say题目为敬!
(这是一道基础题,大佬勿喷,本人技艺不精嗷嗷DBQ)

有一批易感人群住在网格状的宿舍区内,宿舍区为ll的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。
在第一天,有些房间里的人得了流感,(隔离!!)以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。
请输出第m天得流感的人数。**爬爬))))
————————————————————————————————————
输入哒哒哒
**第一行一个数字l,l不超过100,表示有n
n的宿舍房间。
接下来的l行,每行l个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数n,n不超过100。

————————————————————————————————————
输出·叭叭叭
输出第n天,得流感的人数。
————————————————————————————————————
惊喜的样例输入时间:
5
. . . . #
.#.@ .
.#@. .
#. . . .
. . . . .
4
(这@咋这么大)
————————————————————————————————————
奇异的样例输出时间
16
————————————————————————————————————
【惊不惊喜意不意外】
这是一道基础题,但网上答案巨不靠谱
还没有体现 中·心·思·想:递归调用
|
|
|
|
|
|
|
|
|
|
|
接下来begin吾的时间
吾之补充!
1传染是一人上下左右传的,题目没说,很坏啊!
恶劣!

2伊蕾娜是我老婆

思考时间到!请大家踊跃发言
|
|
我们先来思考一下,这章讲的什么?
递归调用
递归调用!!!
递归调用

递归调用像一串链子,从中间一条主干出发,每个分支自己又把自己当成主干,继续分支
emmm

直到递归边界的出现才停下来。。。

emmmmmm
那感冒传染像不像这个模式?!
你上下左右乱传传到我身上了,我也上下左右乱传

就是调用最早那个人的模式啦

解决time!
我们先把宿舍当成二维数组,方便嘛

我们拿样例输入做例子

定义一个全局宿舍

  1. char x[101][101]
    这样是不是明白点!

现在主函数把输入打进去!
(注意定义了两个全局变量l和m
文章打到最后才回过头来发,,,,,,bqbq)

在这里插入图片描述
这里定义一个n来最后数有几个感染者

输入打完了,我们来整函数

我们先整一个函数
void flu()
//初中单词哦,用void是因为全局宿舍不需要返回值
————————————————————————————————————
————————————————————————————————————
我们给他整三个参数!!](https://img-blog.csdnimg.cn/09291581df1c443aa641dc720193c340.png#pic_center)

(为什么整三个参数且听我细细分解)

flu(int a,int b,int num)
既然是二维数组,那么a和b是横坐标和纵坐标
既然一天传的人数是固定的,那么第二天传的时候让它天数加一
这每一天都有函数对应感染的人

(这么说理解么。。。评论区见)
————————————————————————————————————
so
递归只要
flu(—,---,num+1)就代表下一天的感染的人啦
呢么上下左右传这样的弟弟行为,就得
在这里插入图片描述
flu(a+/-1,b+/-1,天数+1)不就行啦

至于函数的内容麽
就是把没有感染的普通人替换成感染者,用ab的坐标,
然后调用自己上下左右爬
每爬一次天数加一!!这样就搞定了
————————————————————————————————————
然而猫猫fa现问题并没有那么简单
在这里插入图片描述

出现了新问题!!!!!!
dark问题!!

我们的主函数的线性遍历的

如果你有啥憨憨遍历方法可以跳过这儿
在这里插入图片描述
so你第一天运行完
主憨数会把第一天第一个感染者传播出去的人
当成原本感染的人呀

第一天 ,,,,,,,,,,,,,, 第二天
。。。@。。|||||||||||||||||||||||||||||||||||| 。。@@@。
。。。。。。|||||||||||||||||||||||||||||||||||| 。。。@。。
。。。。。。 ====》》|||||||||||||||||||。。。。。。
。。。。。。|||||||||||||||||||||||||||||||||||||。。。。。。
。。。。。。||||||||||||||||||||||||||||||||||||| 。。。。。。
。。。。。。||||||||||||||||||||||||||||||||||||| 。。。。。。
触发第二天的条件就是遍历碰到@
so这样行不通滴
那我们咋办????????
|
|
|
|
————————————————————————————————
既然主憨数这么憨,只认得@得病,
那我们就把第一天以后传染的病人变成
另一个符号他不就认不出来了嘛

马猴烧酒上!!

为了保险起见,防止你们 ?我,我就先 ?为敬了
————————————————————————————————————
只要把flu函数中的
x[a][b]=‘?’;
就ok啦!

————————————————————————————————————

在这里插入图片描述
————————————————————————————————————
okok,那么现在到了递归调用函数的第二个重点阶段(最后一个了大家挺住)
||||||||||||||||||||||||||||||||||||||||||||||||
确定递归边界!!!!|||||||||
||||||||||||||||||||||||||||||||||||||||||||||||
其实很简单啦,不要考虑漏了就是啦
1.数组不能越界
宿舍哪能违章扩建呐
2.当遇到@或者?的时候说明人家已经给感染了
感染的再传就没意义了,人家自己也会传
3.传染的天数要小于等于你要找哪天局面的天数
是不是忘了还有一个输入n啦,,,你要找的就是第n天的局面哦
4.当遇到@时,一定要再加一个条件,天数要大于1
如果天数是1的话就是第一日感染的人第一天就给你return了就没有传人了
5.求求了点个赞吧
强行安利一部番《GOSICK》 很感人
在这里插入图片描述

————————————————————————————————————————————————————————————————————————
最后一步啦(很简单哒哒
|
|
|
|

在这里插入图片描述
还记得最早定义的那个计数n吗
这儿就派上用场啦
用来遍历时数有几个?或者@呐

最后不要忘了return 0哦;
—————————————————————————————————————————————————————————————————————————输出结果!!!!!
在这里插入图片描述
这是第1天的局面和人数(-------------------下方,最后一个数字是感染人数)
(电脑不好运行时间长了点别介意)
在这里插入图片描述
第二天的局面和人数在这里插入图片描述
第3天的局面和人数
在这里插入图片描述

第四天的局面和人数(也就是题解16)
谢谢柠檬
给个过叭,,,,写一个多小时啦
最后发下原代码(不带局面的哦)
在这里插入图片描述
在这里插入图片描述
因为本人技艺不精啊,程序可能存在漏洞。。。只是我个人对这道题的见解罢了。。。。。望大家笑纳啦
谢谢大家
放下魔女抱着睡觉觉

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值