“路面覆盖”顺应型编程
编写程序在某些时候是可能有“捷径”走的。看似定义严密的某些题目往往可能会有逻辑“捷径”。聪明机智的参试者在开始编程之前应浏览一下题目,看看在不违背题目要求的前提下,有意识地合理地避开“障碍”,力求用
更简单的编程方式,从而节约120分钟宝贵的竞赛时间给自己带来更大的胜算。熟悉这些编程技巧的学习者,一定会记得当年的“雪龙号破冰船”试题,用题目举例所给的“冰块”的坐标数据,破冰船是很容易通过的;要是随意给出“冰块”的坐标,让破冰船在繁杂的程序判断指令的指挥下冲出重围,那就要难得多(见后面附图动画)。
雪龙号破冰船动画
题目给出的冰块坐标现成的就有一个可通行空隙
依就题目的数据编程将会容易得多
详细编程请参考《复赛详解》原书
话得说回来,竞赛方编制题目的设计者非常可能是出于友爱之心不将题目限制得太难、太死板,毕竟参赛对象都是初学编程的小学生。整张试卷题目全部都太难、或是都太容易,就无法分出参赛者编程能力的高下。
试题“路面覆盖”给出了5个坑洼的表数据(lmfg [100 130 200
370 430]),还在示意图(图3)中画出了3块覆盖的木板。我们可以顺应“图3”的要求来编程,问题就变得相当简单。因为题目(请参考上一次博客)并没有明确说明是不是需要你所编写的程序可以适应任意输入的坑洼位置的表数据去画出“路面覆盖”动画。
下面的源程序里3块木板的起始位置不是“算”出来的,而是直接从题目提供的5个坑洼表数据“掰着手指头”找出来的(lmfg
[100 130 200 370
430])。依样画葫芦地在示意图所指出的3个地方粘贴上“木板”,这样的编程绝对是完美无缺无可挑剔的,没有任何毛病。要是现场编程算出这3个起点,真是可麻烦了。所以,这种“顺应”题目的要求、顺势而为从简的编程,呈现出来的是“捷足先登”的智慧。
题目给出的示例图3:
如果是沿着“可以适应任意输入的坑洼位置的表数据去画出‘路面覆盖’动画”思路来编程,程序确实是更加“智慧”了,但难度也会一下子变得非常高了。这种“智慧”型程序我们在下一次的博客里另行讨论。
顺应型编程源程序如下:
to lmfg :kw
;路面覆盖主程序
:kw是坑洼左边起点数据表
cs ht
make "kn count :kw
;读取坑洼总数量:kn
lm
;画路面
mb 100
;画第1块木板lmfg [100 130 200 370
430]
mb 200
;画第2块木板lmfg [100 130 200 370
430]
mb 370
;画第3块木板lmfg [100 130 200 370 430]
end
to lm ;画路面
pu setx -300 pd
;画图的起点左移使图形居中
for[i 1 :kn][
;逐个读取:kn个坑洼的起点位置数据
make "wz item :i
:kw ;读出当前坑洼左边的位置数据值
setx
:wz-300
;注意!-300使图形居中,总宽度是600
rt 180 fd 10 lt
90 fd 20 lt 90 fd 10] ;画出这个坑洼 每个坑洼都是一样的
setx 300
;补齐到最右边路面的线段
bk 50 setx -300 sety
0 ;画好下面的剩余线段
setfc 15
;对路面涂上灰色
pu setxy -290 -10 pd fill
pu
end
to mb :mbx
;画面板子程序
:mbx单块面板左下方X坐标
seth 0 setfc 9
pu setxy :mbx-300 3
pd ;每块面板在Y方向上浮3个点与路面分离
repeat 2[fd 5 rt 90 fd 80 rt 90]
;画木板外框
seth 45 pu fd 3 pd (fill
"true) ;对木板涂色
end
加载中,请稍候......