趣味数学编程题解之蜗牛爬墙
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倍,正是因为这种扩大,为编程提供了方便,同时给编程也带来了一定的麻烦。如一小时的转换问题就不能忽略,但这种转换是值得的,它为精确计算时间创造了条件。