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