计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题的互动教学过程

吕兰兰+黎明

摘要:针对算法设计与分析课程难度较大、对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引导学生进行问题理解、算法设计、算法实现。特别是在算法实现环节,一行一行地动态展示程序的编写过程,同时充分考虑学生现有的编程基础,采用程序填空的形式降低学生编程难度,有助于消除学生的畏难心理,有效提高了学生的学习兴趣,同时锻炼了学生的计算思维。

关键词:棋盘覆盖;递归;分治;互动教学

中图分类号:TP301 文献标识码:A 文章编号:1009-3044(2016)35-0146-02

Interactive Teaching Procedure of the “Divide and Conquer” Algorithm with the Problem of “Chess Board”

LV Lan-lan, LI Ming

(Department of Software Engineering, College of Electronic and Information Engineering, Hunan University of Science and Engineering, Yongzhou 425100, China)

Abstract:The course of algorithm design and analysis is difficult to those students with poor programming ability. This paper describes the interactive teaching design of the “divide and conquer” algorithm with the problem of “chess board”, which includes directing students to understand the problem, design and implement the algorithm. Especially during the phase of algorithm implementation, we show the procedure of programming to students line by line. At the same time, we use “program completion” to make programming easy for students. It is help to eliminate students fear, inspire their interest and train their computational thinking.

Key words: chess board; recursion; divide and conquer; interactive teaching

1 引言

對算法的研究已经被公认为是计算机科学的基石,算法设计与分析课程也是我校软件工程专业的一门专业核心课程,学习算法的重要性毋庸置疑。但算法设计与分析课程具有难度大,对学生编程能力要求高的特点,不少学生望而却步。在教学过程中我们发现,虽然大部分学生能正确理解算法的思路,但是却不能以某种高级程序设计语言实现算法。针对学生这种“眼高手低”的现状,本文提出将“程序填空”这一程序设计类课程考试中常用的题型,应用到算法设计与分析课程日常教学中,通过实施互动教学降低课程难度、激发学生兴趣。我们以分治法求解棋盘覆盖问题为例,逐步引导学生完成从算法的思路解析到完整实现的全过程,聚焦从算法到程序的“最后一公里”。

2 棋盘覆盖问题

2.1 问题描述

棋盘覆盖问题是许多国内教材[1-2]在阐述分治法时使用的一个经典案例,具体描述如下:

在一个个方格组成的棋盘中,若恰有一个方格与其它方格不同,则称该方格为一特殊方格,称该棋盘为一特殊棋盘。图1为k=2时的一个特殊棋盘,其中特殊方格的位置是(1,2),用阴影表示。

在棋盘覆盖问题中,要用图2中4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

图棋盘覆盖问题的已知条件是在一个的棋盘上有一个特殊方格,因此算法的输入可以用来表示棋盘的大小,用(dr, dc)来表示特殊方格在棋盘中的位置。棋盘覆盖问题的输出结果是一个覆盖了L形骨牌的棋盘,如何表示三个方格被同一个L形骨牌覆盖称为关键。学生比较容易想到的方法是使用同一种颜色来填充被同一个L形骨牌覆盖的三个方格,这是一种形象化的思维方式。为了将数据抽象成程序设计语言方便处理的形式,可以从颜色在计算机中的存储形式(整数)出发,引导学生直接使用整数来填充表示被同一个L形骨牌覆盖的三个方格。这样就完成了棋盘覆盖问题中输入/输出数据的抽象,并且可以得到函数的原型:void ChessBoard(int size, int dr, int dc, int **board)。

3.3.2 C++实现

根据3.3.1中的数据抽象结果得到函数原型后,进行算法实现时,还有2个待解决的关键问题。第一,如何确定递归函数ChessBoard的停止条件。大部分学生认为是最简单的情况是当的时候,即:的棋盘中有一个特殊方格,此时剩余的3个方格刚好可以用一个L形骨牌来覆盖。但事实上更简单的情况是当的时候,即:的棋盘中有一个特殊方格,此时根本无需任何覆盖。因此可以通过提问的方式启发学生思考当的时候是不是最简单的情况。第二,在函数原型void ChessBoard(int size, int dr, int dc, int **board)中,仅有size这个参数并不能确定当前正在处理的是哪个子棋盘。虽然教材上给出的函数原型是void ChessBoard(int size, int tr, int tc, int dr, int dc, int **board),使用了每个子棋盘的左上角方格的位置(tr, tc)来标识当前所处理的子棋盘。但是要想到这一点其实并不容易,这是算法实现时的一个难点。

目前,针对该难点我们在教学中采用的处理步骤是:(1)根据函数原型void ChessBoard(int size, int x, int y, int **board)实现算法,经测试程序运行结果不正确。(2)通过输出每一个L形骨牌覆盖后的棋盘,指导学生使用单步执行的调试方式查找出错原因。然后,根据出错原因在函数ChessBoard的参数表中增加标识子棋盘位置的参数tr和tc。(3)使用更新后的函数原型void ChessBoard(int size, int tr, int tc, int dr, int dc, int **board)重新实现算法,经测试程序运行结果正确。上述教学步骤的执行难点在于要求学生具有较强的程序调试能力和程序分析能力,但是相对教材中直接给出更新后的函数原型及源代码,上述处理步骤方法对学生来说过渡更自然、更符合学生的从易到难的认知规律。

在第(1)、(3)步中实现算法时,在教学中我们采用了“程序填空”这一程序设计类课程期末考试试卷中常见的题型,来提供尽可能多的提示信息帮助学生完成从算法伪码到C++程序的过程,消除部分基础较差学生的畏难心理。下面仅给出当特殊方格位于右下角子棋盘时的“程序填空”范例,学生可依据填好空之后的程序快速写出处理其它3种情况的程序。其中,在学生进行程序填空时可以提供作为辅助信息。

4 教学效果

通過实施上述互动教学设计,在教学过程中引导学生进行问题理解、算法设计、算法实现。特别是在算法实现环节,有别于传统的将程序一次性展示在学生面前,手把手带领学生一行一行将程序写出来,顺应学生的思维方式来讲解,使学生能够看到算法实现的全过程,而不仅仅是算法实现的结果。同时,充分考虑学生现有的编程能力,采用程序填空的形式,既能激发学生兴趣,打破课堂沉闷,也能降低编程难度,有助于消除学生的畏难心理,让学生获得学习的成就感,有效提高了学生的学习兴趣,同时锻炼了学生的计算思维。

5 结论

分治算法采用“分而治之”的策略,将问题分解为规模较小的子问题,这些子问题互相独立且与原问题形式相同。分治策略递归地求解这些子问题,然后将各子问题的解合并得到原问题的解。其中的难点在于递归求解子问题,递归函数原型的设计成为关键,学生学习存在一定的困难。以棋盘覆盖这一较为形象的问题作为实例进行分析,对分治算法求解该问题的教学过程进行互动设计,能够深入浅出、形象地展现求解的方方面面,加深学生对于分治算法的理解,为学生进一步应用算法解决实际问题奠定基础,具有较好的教学效果。

参考文献:

[1] 王晓东. 计算机算法设计与分析[M].第4版. 北京:电子工业出版社,2012.

[2] 赵端阳,刘福庆,石洗凡. 算法设计与分析——以ACM大学生程序设计竞赛在线题库为例[M]. 北京:清华大学出版社,2015.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值