趣味数学编程题解之蜗牛爬墙

IT商界

  走极端的情况总是少的。这期中给出的条件有时不多也不少,这样的题目很费脑筋?其实,最关键的是找出有利于我们编程的条件。如果找不到或不合适,还要学会有依据地补充条件。

  题目:蜗牛爬墙

  有一个古老的难题,是关于蜗牛爬墙的:有一堵11尺高又很滑的砖墙,一只蜗牛千辛万苦爬到了顶上,然后它开始从另一端往下爬。一个小时它能爬5尺,但是每爬完一小时后它都要歇上一小时。在这一小时的休息过程中,它又滑下去3尺。需要多长时间蜗牛才能从另一面爬下这堵两面都很滑的砖墙?

  问题分析

  从题目上我们不难发现蜗牛爬行有三个规律,墙在11尺以下时,每小时前进5尺,下滑3尺,得到的结果是爬上两尺;而当蜗牛正达到11尺并在此休息时,那它的前进速率就是5尺了,休息时将不下降;如果是下的时候,不休息未达到地面之前是5+3尺每小时。

  处理过程分析

  蜗牛爬行速度是不变的,是5尺,关键是休息时时,问题分三个阶段,上墙时,骑墙和下墙。

  (1)上墙时

  看是否符合骑墙条件,如符合,将不倒退,如不符合则倒退,直至骑墙时为止。

  (2)骑墙时

  骑墙是一种转折状态,因而没有路程,也就没时间。

  (3)下墙时

  看是否符合下墙条件,如符合,则将休息时间内的爬行计入,直至到达地面为止。

  除了上面的问题,另一个问题也是不得不注意的:

  (4)怎样计算时间从0一直到蜗牛爬完墙的全部用时,每次增长多长时间比较合适

  因为题中可能由于小数的出现而使计算不精确,我们最好再把单位换算一下,以消除这种影响。并且时间一次增加一小时有点过大,所以考虑对原题做一下变换。

  题目变换

  将题目做如下的变换,将更加有利于我们编程。将尺都乘上60,同时将时间以分作为单位,则题目可这样叙述:

  有一个古老的难题是关于蜗牛爬墙的:有一堵660单位高又很滑的砖墙,一只蜗牛千辛万苦爬到了顶上,然后它开始从另一端往下爬,一个小时它能爬300单位(5单位/分),但是每爬完一小时后它都要歇上一小时。在这一小时的休息过程中,它又滑下去180单位(3单位/分)。需要多长时间蜗牛才能从另一面爬下这堵两面都很滑的砖墙?

  有了上面的转换,题目中的条件也就出来了:

  蜗牛的结束可通过路程来控制,路程全长是660×2=1320,如果达不到全程,要继续爬墙,程序则继续执行。

  660则是一个分界线。对于向前爬的状态没什么学问,关键是休息时,小于660,是爬墙,休息时退后,大于660,是往下爬,休息时也向前走。而如果恰在此时休息,则要考虑另处一种状态:休息时不走。

  而时间则以60分为界,第一个60分爬,第二个60分休息;第三个60分爬,第四个60分休息;……

  语言、界面、源程序

  (1)语言

  程序中通过Virual BASIC6.0语言来实现。

  (2)界面

  界面非常简单,建立一标准EXE工程,其caption设为“蜗牛爬墙”,在窗体上放入一个文本框控件,其名称改为txtlist,将text属性改为“”,再在窗体上放一命令按钮,其属性name为cmdlist,caption为“计算”。一切OK。我们将代码加给cmdlist_Click()即按钮的单击事件,将来运行我们只要用鼠标单击一下窗体,程序就执行了。

  (3)源程序

  Option Explicit

  Private Sub CmdList_Click()

     Dim a, s, k As Integer

     Dim flag As Boolean

     Dim t As Integer

   TxtList.Text = "" '各清空文本框

     s = 0 '路程

     t = 0 '时间

     k = 0 '休息和爬行时间控制:1-60爬行61-120休息

     flag = False '骑墙标志

     While s < 1320

     t = t + 1

     If t = 10000 Then Exit Sub

     k = k + 1

     If k > 120 Then k = 1

     If s <= 660 Then

       '上墙

       If k <= 60 Then

         s = s + 5

        Else

         If s = 660 Then

         Else

         s = s - 3

         End If

       End If

       If s = 660 Then '骑墙

       'TxtList.Text = TxtList.Text + Str(t) + vbCr + vbLf

       flag = True '骑墙标志

       k = 1

      End If

     Else

       '下墙

      If k <= 60 Then

       s = s + 5

      Else

       s = s + 3

      End If

     End If

    Wend

    If flag = True Then

     t = t + 60 '加上骑墙时间

    End If

    '输出

    TxtList.Text = TxtList.Text + Str(t) + "分即:" + Str(t / 60) + "小时"

    End Sub

    (上程序在VB6.0、Win2000下调试通过)

  编程小结

  答案如下:

  636分即:10.6小时

  本题是一个时间的问题,如果不做适当的转换,可能出现由于小数的运算而导致时间误差,我们在题中将几个条件扩大了60倍,正是因为这种扩大,为编程提供了方便,同时给编程也带来了一定的麻烦。如一小时的转换问题就不能忽略,但这种转换是值得的,它为精确计算时间创造了条件。