蓝桥杯 历年真题 2013年B组第8题 翻硬币(暴力解法 非BFS广搜)

本文介绍了2013年蓝桥杯编程大赛B组第8题——翻硬币的问题,讲解了如何通过暴力求解法解决这个问题,而非使用BFS广度优先搜索。文章通过分析样例,发现规律,简化了原本看似复杂的动态规划题目,并提供了C++的解决方案。
摘要由CSDN通过智能技术生成

很久没有做真题,今天回归2013的真题开始,编程大题是七、八、九、十。
第七题是错误票据输入输出实在太复杂(感觉可能是蓝桥里数一数二复杂的)所以就没有深究了。看第八题。
第八题:

翻硬币

小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:oo*oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
在这里插入图片描述思路
直接看到这一题会感觉很复杂,有一点动态规划的感觉,感觉重重复复的并不怎么直观,那么其实只要我们推演一下样例,就会有感觉了。
在这里插入图片描述推演完样例之后,我们会发现这套题是很符合BFS的规律的,奈何没有学习到图论,只会DFS不会BFS因而放弃。
那么这题还有另一个解法就是找规律了,通过手算的过程中我们可以发现:似乎有这样一个规律,只要判断出两个字符串中的不相同的字符,统计他们的位置差值,即就是他们的解了。
那么现在这样一个复杂的题就变成了一个找规律就可以解决了的题。为了确保这样的有效性,我们可以试着画出含有多个不匹配项的图,试着去计算。如下图:
在这里插入图片描述发现结果是一样的,那么就可以直接开始动手了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值