在洛谷中有一道入门题,硬币翻转,虽然说不上多难,但对于很多初学者(比如我)应该是比较费时间的,那么,接下来,就由我来为大家讲解一下整体的一个思路(未优化过的)
1.首先是翻转条件,假设有n枚硬币,那我们一次,就必须翻转n-1枚,并且,要求整体全部翻转完后用的翻转次数最少,那么,我们应该怎么做呢?这就是接下来的过程了,过程我会为大家分成六个大的步骤
2.第一步,我们从后向前,翻转n-1枚。
第二步,我们将最前面,也就是上一次没有 翻转到的那个那枚硬币,和从后向前n-2枚硬 币翻转一次
第三步,和第二步刚好相反,这次我们将从 前向后的n-2枚硬币,和最后一枚硬币翻转一 次
第四步,和第一步相反,我们将从前向后, 翻转n-1枚硬币
第五步,与第二步类似,我们将最前面两个 和,从后向前n-3枚硬币翻转一次
第六步,如果一开始硬币均为正面向上,那 我们这次,只需要将其中都是正面向上的硬 币翻转一次即可(你会发现,恰好也是n-1 枚)
3.那么,我相信,看到这里,各位肯定有些疑 惑,比如,当硬币为两枚时,我们根本不需 要第三步和后续步骤,当硬币为四时,我们 又不需要第四步之后的步骤,当硬币数量大 于六时,我们只靠这六步,似乎做不到全部 翻转,那么,这里,也就是为什么我前面说 是五个大的步骤了,硬币数量<=4的情况, 我们暂且不讨论,后续会说。当硬币数量大 于六枚时,第五步,就是关键了,细心的读 者可能发现了,这些步骤,刚刚好对应了硬 币数量,并且,硬币数量都是偶数,是的, 如果当数量为奇数时,我们每次翻转的数量 是偶数个,而偶数加偶数是不可能等于奇数 的,所以,这个问题本身,就抛去了奇数个 的情况,而最少步骤的次数,也恰好就是硬 币的个数,所以,当硬币大于六个时,第五 步就要开始一个循环,而每多两个硬币就要 多循环一次,并且,每次循环时,翻转方式 也要改变,改变方法是,每多循环一次,就 令最前面翻转的硬币数量加一,然后,最后 面翻转的硬币数量减一,以此类推,最后再 加上第六大步就可以了
那么,以上就是我们的一个整体思路了,接下来,我会为大家演示详细的代码 (1).各变量的对应含义
(2).第一步和第一步对应的打印并换行
(3).第二步与第二步对应的打印与换行
(4).第三步的实现
(5).第四步的实现
(6).至关重要的第五步,和它的循环
(7).最后一步的实现,也是最简单的一步了
以上就是硬币反转问题的全过程了,因为我也是第一次接触这个题,废了不少时间,中间这些思路也是自己举例一次次在纸上尝试的,然后总结出来的思路,所以,代码整体看着很啰嗦,也很笨长,也还未优化,所以,各位看的时候,还请见谅(இωஇ )(而且,我也是一位初学者,所以,代码思路,也显得比较呆,如果各位大佬有好的思路和优化方法,欢迎评论留言,请各位大佬多多指教!)