编程题:青蛙过河

某家公司的笔试题~

题目链接:http://cpp.zjut.edu.cn/ShowProblem.aspx?ShowID=1313

Description:

池塘中有一条由荷叶拼凑而成的、长为N*2+1(1<=N<=30)的独木桥。如下所示(N=3):

 

F F F 空格 G G G

其中,中间的那片空格荷叶(即第N+1片)一开始是没有青蛙的。左边有N只青蛙,这些青蛙只会向右边跳(标记为F);右边也有N只青蛙,只会向左跳(标记为G)。一片荷叶上只能站立一只青蛙,并且在同一时刻只能有一只青蛙跳跃(防止相撞)。一只青蛙可以向它所在的方向上跳1格,或者2格,必须得落在那片空的荷叶上。

当荷叶两边各有一只青蛙时(原始状态:F 空格 G),可以通过下列步骤:

1.F右1 ->空格 F G,即F位变成空格位,而空格位被F所占

2.G左2 -> G F 空格,即G位变成空格位,而空格位被G所占

3.F右1 ->G 空格 F

来完成左右青蛙互相过河。

请问,当河的两边各有n只青蛙时,最少需要几步和最多需要几步,其两边的青蛙才能完全交换?

注意,左边的第一只青蛙不一定要跳到最右边那一端,只要任选一个G的位置作为它的最终位置即可。

 

Input:

多组测试数据。每组一个整数N(1<=N<=30),处理到文件结束。

Output:

每组输出占一行,分别输出,对应的N需要最少几步完成交换,和最多几步完成交换,中间以空格分开。

Sample Input:

1

Sample Output:

3 3

Source:

XCL

 

这是一道纯粹的数学题目,都不用写代码,最后的结论是对于长度为2N+1的独木桥,最少可以通过N^2+2N步完成交换。

下面我们来看一下最少几步的结论是如何分析得出的。

我们用#代表空格,A代表左侧的青蛙,B代表右侧的青蛙。

A1 A2 A3 # B3 B2 B1

我们首先思考这个问题,假设青蛙只能跳跃一格(当然,严格来讲只能跳一格是完不成这个目标的,我们在这里先模糊处理这个问题,假设多只青蛙可以在同一个格子),那么我们的青蛙一共要跳跃几个格子呢,或者说所有青蛙的位移总和是多少?以上面N=3的情况为例,假设A1->B1,A2->B2,A3->B3(其他情况都一样,对结论没有影响),答案是(2+4+6)*2,因此对于N的情况,总位移为(2+4+6+...+2N)*2,这是一个等差数列,也是一个不可能存在的最大值。

下面我们思考,什么时候跳跃数最少呢?跳两格格子最多的时候,每跳跃一次两格格子,上面得到的最大值就可以-1.下面我们就要思考,什么时候可以跳两格格子最多,最多是多少。我们可以想到的极限情况就是,举个例子,单纯看B向A移动,所有的B都可以越过某一个Ai,而这样的Ai有N个,也就是说,最多可以跳跃N*N次两格格子。因此答案就是

(2+4+6+...+2N)*2 - N*N = N^2+2N

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页