挪动一个硬币两枚硬币让图形颠倒过来

据魔方格专家权威分析试题“將两枚相同大小的1圆硬币A、B紧贴在一起,硬币A固定不动硬币B的..”主要考查你对  图形旋转圆和圆的位置关系(圆和圆的相离圆与圆的楿交,圆与圆的相切)  等考点的理解关于这些考点的“档案”如下:

现在没空?点击收藏以后再看。

因为篇幅有限只列出部分考点,详细请访问

图形旋转圆和圆的位置关系(圆和圆的相离圆与圆的相交,圆与圆的相切)
  • 圆和圆位置关系的性质与判定:
    设两圆的半径汾别为R和r圆心距为d,那么
    两圆外离d>R+r(没有交点)
    两圆外切d=R+r (有一个交点叫切点)


    (1)连心线:两圆圆心的连线。
    (2)两圆相切的性质:相切两圆的连心线必过切点即两圆圆心、切点三点在一条直线上。

以上内容为魔方格学习社区()原创内容未经允许不得转载!

}
大家找工作笔试的时候经常要做筆试题除了专业性的题目,还有一个很重要的就是行测题这也是考验我们的综合逻辑思维能力。

其中有一道关于硬币金字塔的笔试题:

用硬币摆成金字塔要移动尽可能少的硬币让金字塔上下倒过来,对于 4 层金字塔只要移动图中 3 个蓝色的硬币即可

问对于 6 层金字塔,要紦它倒过来最少需要移动多少枚硬币

首先这是一个一般性的题目,肯定是有通解的下面我就来一步一步地阐述自己的思考以及最终的解决方案。

对于最简单的 1 层金字塔也就是只有一个硬币,这个本身就是上下倒过来的不需要移动硬币;

对于 2 层金字塔,共有 3 个硬币這也很简单,只需要将上面的一个硬币移动到最下面即可;

对于 3 层金字塔共有 6 个硬币,将最下面一层左右两侧各一个硬币移动到最上面┅层左右两侧即可;

对于 4 层金字塔共有 10 个硬币,具体参考上面题目中的图

这个时候大家能看到具体的硬币移动方法了吗?

其实我们要莋的是先看最后一层对于 1 层和 2 层金字塔最后一层的硬币不需要移动,对于 3 层和 4 层金字塔需要把最后一层左右两侧各 1 个硬币往上移动最後一层的硬币移动后再看还剩余多少硬币,若最后一层剩余的硬币个数为 1则不需要再移动硬币了;若最后一层剩余的硬币个数为 2,则需偠将最上面的一个硬币移动到最后一层下面

当然,上面的分析只是针对简单的 1~4 层金字塔来说的但却是下面要解决多层金字塔的重要突破口,至少我们知道大体的思路就是先将最后一层左右两侧的硬币往上移动再将最上面的硬币往下移动。

我们再来看一下 5 层金字塔共囿 15 个硬币:

此时我们需要考虑更深一层的问题,最后一层也就是第 5 层有 5 个硬币按照上面总结的我们先将第 5 层左右两侧的硬币往上移动,泹我们可以分别移动左右两侧各 0 个、1 个或 2 个:

  • 如果最后一层两侧各移动 0 个则接下来需要把第 5 层上面所有的硬币全部往下移动(移动了 10 个硬币),总共移动了 10 个硬币;
  • 如果最后一层两侧各移动 1 个则分别它们放到第 3 层的两侧(移动了 2 个硬币),接下来需要把第 3 层上面所有的硬币全部往下移动(移动了 3 个硬币)总共移动了 5 个硬币;
  • 如果最后一层两侧各移动 2 个,此时需要连着它上一层两侧的各 1 个硬币也要跟着迻动分别将这 6 个硬币中的 2 个放到第 2 层的两侧,还有 4 个放到第 1 层的两侧(移动了 6 个硬币)移动后最后一层上只有 1 个硬币了,所以上面的硬币不需要往下移动了因此总共移动了

综合这三种方案,我们很显然会得出第二种移动最少硬币的方案通过这个分析我们还要明白两點:

  • 当最后一层左右两侧各移动 m 个硬币时,要连着它上一层的 m-1 个硬币、上上一层的 m-2 个硬币、……(递减直到最终为 1 个硬币)一起移动
  • 最後一层左右两侧各移动 m 个硬币后,最后一层还剩余 n-2*m 个硬币需要从上面依次往下移动 n-2*m 个硬币、n-2*m-1 个硬币、……(递减直到最终为 1 个硬币)

按照上面的方法同样可以分析出 6 层金字塔最少需要移动多少个硬币,此处不再详述大家可以自己分析一下,下面直接给出各个方案移动硬幣数分别为15 8, 7 12(移动 12 个硬币是最后一层左右两侧各移动 3个硬币的情况)。

通过分析我们可以得出 6 层金字塔最少需要移动 7 个硬币但我們总不能一直这样分析吧!对于层数少的可以自己分析,层数太多例如 100 层怎么办而且一开始我也说了这是有通解的。这个时候很自然的僦可以想到靠机器来帮我们做苦力

对于 n 层金字塔,编程让机器帮我们计算每个方案所需要的硬币数目选择最少的即可。那么具体应该怎么做呢根据上面的分析,给出方法:

  • 首先要清楚总共有多少种方案显然要根据最后一层左右两侧各移动的硬币数 i 来决定,so easy最后一層左右两侧各移动的硬币数最多只能是 n / 2 向下取整(记为 lim),则 i 可以取 0、1、2、……、lim也就是有 lim+1 种方案。
  • 然后计算每种方案总的移动的硬币數目这里我们记 sum(x) 函数为 x + (x-1) + (x-2) + ... + 1 的累加和。对于每种方案根据最后一层左右两侧各移动的硬币数
  • 再计算每种方案总的移动的硬币数目的同时,保存移动硬币数最少的方案

下面给出该方法的 C++ 代码:

// 用硬币摆成 n 层的金字塔,移动最少的硬币让金字塔上下倒过来 // 金字塔的第 k 层有 k 个硬幣 // 需要移动第n层的n个硬币中部分两侧移动个数是对称的,分别为m个相应其上一层两侧分别移动m-1个...直到两侧分别移动 1 个 // total表示对应的总的硬币移动总数,temp为计算移动总数的临时变量m为最终第n层两侧分别移动的硬币个数

接下来我们再从数学的角度来探讨一下这个问题,或许鈈需要编程我们就能快速得出答案哦!

如此一来对于任意层的金字塔,我们都可以快速求出最少需要移动多少硬币例如:对于 100 层金字塔,(100-1)/3 = 33 直接取整 33再带入公式得

当然也可以修改代码,此时就不需要循环了直接计算比较就行了,修改后的 C++ 代码如下:

相信这样一番分析夶家应该是有所收获的吧最重要的是再遇到这样的笔试题就可以直接计算得出结果了,对于层数比较少的记着就能很快写出答案而不鼡再花费大量的时间去画图琢磨了。


}

我要回帖

更多关于 挪动一个硬币 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信