蓝桥杯,p8597 翻硬币,使用c++实现

'*'是背面 'o'是正面,如果已知了初始状态和要达到的目标状态例如(**o**o*和*o****o)【等长字符串】

每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?


题目分析:题目实际上并不难,但是实现它的算法却需要认真思考!

例如:*o****->****o*;一次只能翻相邻的两个。

我们从头开始对比,发现第一个是相等的,所以翻的时候一定不能把相等的翻了出去。

第二个不一样!那我们就先把第二个反过来,让它正确。紧接着因为要翻相邻的,所以接下来第三个就被翻了,OK此时第二个已经完全相等了,但是!第三个,不相等了。按照刚才的思路,我们继续翻第三个和第四个,结果第四个又不相等了。

直到!第五个,发现翻完之后,完全相等了!!

我们似乎大概明白怎么实现了。换一个例子,心里可以自己测试一下:

{*oo**o***}->{oo****o*o}


OK!放代码:

蓝桥杯,p8597 翻硬币,使用c++实现_第1张图片


每日金句:

               相信自己,一路风景一路歌,人生之美,正在于此。

你可能感兴趣的:(蓝桥杯小题专练,蓝桥杯,c++,算法)