![](https://csdnimg.cn/release/download_crawler_static/86368312/bg4.jpg)
实验实现
• 1.[编程语言]本实验用Java完成算法设计和程序设计并调试通过。
• 2.[解题思想、方法]
本实验题目为简单的棋盘覆盖问题,程序采用Java在MyEclipse下完成。在
一个
个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一
特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同
形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L
型骨牌不得重叠覆盖。
解题思想采用分治法,利用递归的方式,程序中设计一个ChessBoard类,其
中有方法chessBoard,该方法参数为一个二维整型数组board表示方法要处理的
棋盘,整型参数tr表示棋盘左上角方格的行数,整型参数tc表示棋盘左上角方格
的列数,整型参数dr表示特殊方格的所在行数,整型参数dc表示特殊方格所在列
数,整型参数k表示棋盘大小的指数,
。全局变量tile表
示当前L型骨牌序号,L型骨牌可以分为以下四种情况,见下图一。
图一
分治法的思想体现在递归上面,每次递归调用chessBoard函数,把棋盘大小
缩小一倍,即k=k-1,进行判断每次先记录下整个大方块的左上角方格的行列坐
标,然后再与特殊方格坐标进行比较,就可以知道特殊方格是否在该块中。如果
特殊方块在里面,这直接递归下去求即可,如果不在,这根据分割的四个方块的
不同位置,把右下角、左下角、右上角或者左上角的方格标记为特殊方块,然后
继续递归。直接调用下一次递归;否则,将把子棋盘最靠近父棋盘中心位置的方
块设置为特殊方块处理,再以其为特殊方块来进行下一次递归。当子棋盘大小为
1时,即k=0的时候,递归停止并返回。
整个函数按左上子棋盘、右上子棋盘、左下子棋盘、右下子棋盘的顺序进行
判断,逐次进行判断并进行下一次递归。每次递归利用分治法的思想,把问题规
模分解成4个规模小一倍的子问题来处理,如下图二(a)中把
的父问题分解
为4个
子问题,直到最终解决的是大小为
的棋盘覆盖问题。