首页 >行情 > > 正文

每日讯息!一步一步地完成题目——费解的开关(C/C++语言)递推、递归、顺序思维

腾讯云 2023-02-10 22:58:59

前言

本文中博主将一步一步地、以正常人的顺序思维完成题目——费解的开关,使用的核心方法是递推与递归。

题目

参考题目:费解的开关


(相关资料图)

详细的题目信息相信大家都已经知道了,因此这里为了简洁只展示输入输出格式及数据范围。

核心思维

本题利用递推做的核心思想很简单,即当这个5x5数组的第一行被处理完过后,想要开启第一行仍然灭着的灯,则必须点击该灯的下一行的相同位置。

因此,只要确定好第一行如何选择,其他行也自然确定了,之需要判断该种情况是否满足题目条件即可。

如图所示:

假设我们第一行只点一次,即被蓝色X的地方,点完后会变成这样:

如果我们想让第一行的第一个、第四个变亮,那么第二行的第一个、第四个就是必点的。

因此,我们只需要枚举第一行的所有选法,然后就能递推出整个四方体的选法,最后判断成是否成立。

写出数据输入格式

首先,先在主函数里写出题目要求的输入格式。先输入一个n,随后进行n次循环,每次循环都读入25个数据放在一个二维数组arr里。为了传参的时候方便,我们把二维数组放在外面,像这样:

int arr[5][5];int main(){int n = 0;scanf("%d", &n);while (n--){int i = 0;for (i = 0; i < 5; i++){int j = 0;for (j = 0; j < 5; j++){scanf("%1d", &arr[i][j]);}}//...}return 0;}

注意:本题在Acwing上数据输入时,每个数据之间没有空格,因此要控制scanf每次读取数据的宽度。代码中的“//...”代表接下来从此处开始写。

枚举第一行的选择

这里我们使用递归的方法,即在1 ~ 5里面选出1 ~ 5个数,每一种选法都是一种第一行的选择。创建递归函数dfs(int step),step代表当前枚举的位置,在外面创建数组choose代表递归时每个位置的状态,每次枚举当前位置选或者不选,五个位置都枚举结束后就代表形成了一种情况,随后利用判断函数jud对这种情况进行判断。

int main(){//...dfs(0);//dfs的位置}return 0;}
int arr[5][5];int choose[5];void dfs(int step){if (step == 5){jud(choose);return;}//选choose[step] = 1;dfs(step + 1);choose[step] = 0;//不选dfs(step + 1);}

判断情况是否成立(1)

随后我们进行判断函数jud的书写,为了防止同一组数组不同的情况互相影响,我们创建一个临时的数组 arr,复制arr的信息到其中,随后对 arr进行操作。

之后创建i和j,分别用于遍历行和列。

由于i和j的值不同,点灯还是灭灯的个数也不同(因为有可能在边界)。因此,我们创建一个函数change,用于改变arr【i】【j】周围能改变的灯的亮灭情况。

void jud(int* choose){int _arr[5][5];memcpy(_arr, arr, 25 * 4);//对第一行进行操作int i = 0;//用于遍历行int j = 0;//用于遍历列for (j = 0; j < 5; j++){if (choose[j] == 1)//相当于arr【0】【j】被选择了{change(_arr, 0, j);//...}}}

实现亮灭改变函数

罗列情况,改变周围灯的亮灭情况,如果你不想写这么多的代码,也可以把刚开始创建的数组改为7x7大小,就可以不用考虑边界了。

void change(int _arr[5][5], int i, int j){_arr[i][j] = !_arr[i][j];if (i == 0){_arr[i + 1][j] = !_arr[i + 1][j];if (j == 0){_arr[i][j+1] = !_arr[i][j+1];}else if (j == 4){_arr[i][j-1] = !_arr[i][j-1];}else{_arr[i][j - 1] = !_arr[i][j - 1];_arr[i][j + 1] = !_arr[i][j + 1];}}else if (i == 4){_arr[i - 1][j] = !_arr[i - 1][j];if (j == 0){_arr[i][j + 1] = !_arr[i][j + 1];}else if (j == 4){_arr[i][j - 1] = !_arr[i][j - 1];}else{_arr[i][j - 1] = !_arr[i][j - 1];_arr[i][j + 1] = !_arr[i][j + 1];}}else{_arr[i - 1][j] = !_arr[i - 1][j];_arr[i + 1][j] = !_arr[i + 1][j];if (j == 0){_arr[i][j+1] = !_arr[i][j+1];}else if (j == 4){_arr[i][j - 1] = !_arr[i][j - 1];}else{_arr[i][j - 1] = !_arr[i][j - 1];_arr[i][j + 1] = !_arr[i][j + 1];}}}

判断情况是否成立(2)

因为对第一行的每一次选择也算走了一步,所以在每种情况下设置一个变量time,记录当前走了几步,一旦time超过6,就立马return。

注意:第一行只有五个数,因此在第一行的选择中time不可能超过6,因此不需要在对第一行的选择中进行判断。

void jud(int* choose){int _arr[5][5];memcpy(_arr, arr, 25 * 4);int time = 0;//对第一行进行操作int i = 0;//用于遍历行int j = 0;//用于遍历列for (j = 0; j < 5; j++){if (choose[j] == 1)//相当于arr【0】【j】被选择了{time++;change(_arr, 0, j);}}//...//对2,3,4,5行进行操作}

随后对第2,3,4,5行进行选择,对第二行的选择次数,是源于第一行选择完之后还有几个灭着的灯。

因此,我们对上一行进行遍历,如果_arr【i-1】【j】==0,就把time+1,同时点一下_arr【i】【j】。

注意:此时,time已经有可能超过6了,因此需要进行判断。

void jud(int* choose){int _arr[5][5];memcpy(_arr, arr, 25 * 4);int time = 0;//对第一行进行操作int i = 0;//用于遍历行int j = 0;//用于遍历列for (j = 0; j < 5; j++){if (choose[j] == 1)//相当于arr【0】【j】被选择了{time++;change(_arr, 0, j);}}//...//对2,3,4,5行进行操作for (i = 1; i < 5; i++){for (j = 0; j < 5; j++){if (_arr[i - 1][j] == 0){time++;if (time > 6){return;}change(_arr, i, j);}}}//...}

现在,我们已经对1 ~ 5行全部选择完毕,但是不确定是否全部都为1,因此需要进行遍历一次,一旦出现为0的情况,说明这种情况不可取,马上返回。

//检测数组中是否全部为1for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){if (_arr[i][j] == 0){return;}}}//...//运行到这里,说明此种方案可行

对输出数据的处理

题目要求我们输出所有可行的方案中步数最少的一种所消耗的步数,如果没有可行方案则返回-1。

因此,我们设置一个全局变量min_time并令其初始化为一个大于6的数,一旦出现一个time小于min_time,就把min_time更新为time。

如果还有更小的time,就能再次更新。

int arr[5][5];int choose[5];int min_time = 10;
//运行到这里,说明此种方案可行min_time = time;return;//...

随后,我们进行最后的处理。

当dfs(0)结束之后,我们得到了一个min_time,因为它的初始值大于6,所以只要有可行方案存在,该值就一定会被改变,否则,它就依然还是原来的值。

所以,我们设置一个if语句,如果该值为10(初始值),代表没有可行方案,打印-1后换行。

如果该值不等于10,就打印这个数后换行,代表最小步数为该值。

注意:因为min_time是我们在全局定义的,因此打印完了以后不要忘记再将其重新赋值为10哦。(博主改了很久才想到这一点,TAT)

int main(){int n = 0;scanf("%d", &n);while (n--){int i = 0;for (i = 0; i < 5; i++){int j = 0;for (j = 0; j < 5; j++){scanf("%1d", &arr[i][j]);}}dfs(0);if (min_time == 10){printf("-1\n");}else{printf("%d\n", min_time);min_time = 10;}}return 0;}

感谢您的阅读与耐心~ 如有错误烦请指出~

上一篇:手持式测油仪_关于手持式测油仪的介绍_世界观察 下一篇:最后一页
x
推荐阅读

每日讯息!一步一步地完成题目——费解的开关(C/C++语言)递推、递归、顺序思维

2023-02-10

手持式测油仪_关于手持式测油仪的介绍_世界观察

2023-02-10

环球动态:肆无忌惮的近义词的读法

2023-02-10

热议:垄的拼音的读法

2023-02-10

全球短讯!你的住房公积金可能涨了

2023-02-10

青海出台办法规范事业单位人员竞聘上岗

2023-02-10

俄罗斯人收送礼物的风俗礼仪 环球快看

2023-02-10

谢霆锋因孩子问题家暴王菲,致两人分手?王菲现身机场力证!-精选

2023-02-10

金庸小说观看顺序

2023-02-10

2022年中国旅游市场分析报告 天天速看

2023-02-10

宁波将打造“三大高地”助力市场迸发更大活力

2023-02-10

巴西总统卢拉开启任内首次访美 将聚焦经贸和环境等议题

2023-02-10

偷心秘籍:这个老公有点小_当前速看

2023-02-10

今日怎么通过身份证查找火车票信息_怎么验证火车票真假-今日热讯

2023-02-10

焦点快播:中国下午三点德国几点

2023-02-10

全球今热点:短端英债收益率转涨,此前英国央行债券出售不及预期

2023-02-10

大雪节气的由来之说

2023-02-10

全球资讯:神秘物质

2023-02-09

张杨智子个人资料

2023-02-09

每日焦点!老寿星应该多大岁数_老寿星的年龄是多少

2023-02-09

3换3威少离队方案曝光,1.53亿巨星或加盟,辅佐詹姆斯

2023-02-09

lumia830怎么升级win10_lumia830

2023-02-09

共达电声:您所询问的内容涉及公司业务的具体细节,不便感谢理解_天天要闻

2023-02-09

即时焦点:论文绪论写什么_本科论文绪论写什么

2023-02-09

世界讯息:安徽促进养老产业加快发展

2023-02-09

凄寒高地攻略 怎么玩凄寒高地

2023-02-09

9·20沙特航班劫持事件

2023-02-09

奋进新征程新青年演讲稿范本15篇

2023-02-09

AT105萨克松轮式装甲人员输送车

2023-02-09

文秘基础之报告的格式与例文 动态焦点

2023-02-09

世界实时:“提前还贷潮”下房主与银行的博弈 划重点带你读懂

2023-02-09

白花油麻藤

2023-02-08

关于小学心理健康教育心得体会8篇

2023-02-08

头狼:黄金1877公开多

2023-02-08

天天快报!entice怎么读_entice

2023-02-08

交易所债券市场收盘:地产债涨跌不一 “20宝龙04”涨超10%

2023-02-08

腊八节的传统风俗有什么介绍

2023-02-08

FLOWER花

2023-02-08

领取失业金医疗保险算缴费年限吗?领取失业金医疗保险怎么办?_头条

2023-02-08

焦点短讯!业务助理的工作内容有哪些

2023-02-08

咖啡色头发适合什么肤色的人_咖啡色头发适合什么肤色-当前视讯

2023-02-08

上海嘉定:制度化推进移风易俗 红白事简办成新风

2023-02-08

企业报税零申报流程_企业零申报流程

2023-02-08

小学二年级语文上学期期末考试试卷

2023-02-08

南方中证香港科技ETF(QDII)净值上涨2.10% 请保持关注 世界简讯

2023-02-08

王维的《出塞作》赏析 世界速看

2023-02-08

超级战队1月玩具王杂志图情报昆虫战队君王者将在暴太郎中客串

2023-02-08

游园不值 每日速看

2023-02-08

【时快讯】什么叫供给侧?_供给侧是啥意思

2023-02-08

无偿献血记录活动200字_捐血记作文200字

2023-02-07

天天微动态丨少年包青天的小狸叫什么

2023-02-07

党建特色品牌试点,让湖北江陵县昔日小渔村变身“城市后花园”

2023-02-07

2022年考教师编制需要什么条件_考教师编制需要什么条件 环球新视野

2023-02-07

温州到长沙多少公里路_温州到长沙_当前热文

2023-02-07

感恩节几月几号英语怎么写_感恩节几月几号|全球速读

2023-02-07

【热闻】江阴要塞的演员

2023-02-07

今日快看!澄迈集中开工10个项目 总投资92.81亿元

2023-02-07

草河车是拳参还是重楼_草河车同时作为重楼和拳参的别名 全球热资讯

2023-02-07

新动态:周冠宇的商业价值缘何迎来井喷?

2023-02-07

三国杀 徐庶_关于三国杀 徐庶的介绍

2023-02-07

和铂医药-B(02142.HK):HBM1022临床试验启动获美国食品及药物监督管理局新药研究许可

2023-02-07

万都集团有限公司 环球热点

2023-02-07

【天天报资讯】三星NP300E4C-S08CN

2023-02-07

过敏体质是指什么 疫苗_过敏体质是指什么

2023-02-06

热讯:汽车新消息:宝马i4谍照曝光 要盘特斯拉Model 3?

2023-02-06

【当前独家】地铁最后的曙光接前作结局_地铁最后的曙光隐藏完美结局剧透全景解析

2023-02-06

看点:兴文石海旅游攻略国庆_兴文石海旅游攻略

2023-02-06

环球热议:朱琳首夺WTA单打冠军,世界排名将首进TOP50

2023-02-06

日本狮王-天天热议

2023-02-06

环球热点评!交通标志

2023-02-06

2022年河南累计发放消费券26亿元 网上零售额3088.8亿

2023-02-06

中国游客抛弃日韩后!新西兰首发团26000元1分钟售罄:出境游全面开启-世界今日讯

2023-02-06

最新消息:上海长江时代众创空间数字技术有限公司

2023-02-06

下田直子的褶皱技法图典-世界新资讯

2023-02-06

好汉两个半

2023-02-06

当前视点!投光灯

2023-02-05

“国漫之光”遇上大运会吉祥物,梦幻联动上演精彩大运!

2023-02-05

重庆动物园大熊猫享用“元宵大餐” 萌态十足

2023-02-05

担当作为开新局|先进制造业招商全区第一,包头是怎么做到的?

2023-02-05

姚磊-要闻

2023-02-05

唐艺昕早春穿搭上线,针织背心配毛绒外套,时尚又减龄!_世界热文

2023-02-05

焦点观察:海百合_关于海百合的介绍

2023-02-05

今日最新!小米手机电池不耐用可以降系统吗_小米手机电池不耐用怎么办

2023-02-05

硫化氢检测仪

2023-02-05

环球关注:中国历代服饰图典

2023-02-05

中国建设银行股份有限公司上海重固支行_焦点快看

2023-02-04

环球观点:夫妻为了孩子复婚,引起网友争议:请别再自我感动,伤害孩子了

2023-02-04

cad中填充怎么添加自定义图案 cad添加自定义填充图案 今热点

2023-02-04

中华医药栏目_今热点

2023-02-04

世界快讯:王品台塑

2023-02-04

半年度工作总结_单位工作总结报告 天天即时看

2023-02-04

如果这就是爱情歌词完整版 如果这就是爱情歌词

2023-02-04

当前观点:弘历公司

2023-02-04

朱瑾慧|全球热门

2023-02-04

热头条丨李浩培法学文集_关于李浩培法学文集简述

2023-02-04

浊度单位什么意思_浊度单位

2023-02-03

厨师机什么牌子最好_厨师机哪个牌子最好

2023-02-03

二年级学生对老师感谢的话_学生感谢老师的话语二年级-焦点速递

2023-02-03

请问二手房的土地使用证怎样过户 全球资讯

2023-02-03

抚州比亚迪实业公司增资至5亿元 增幅900%|全球速看料

2023-02-03