递归解题的三要素
(1):最小情况
(2):原问题与子问题同型
(3):原问题的解可以用子问题的解来构造
棋盘覆盖问题的描述
在一个2的k次方 X 2的k次方 (此处数学公式的插入待修改)个方格的棋盘中,恰有一个方格与其他方格不同,则称该方格为特殊方格,在棋盘覆盖问题中,要用L型骨牌
覆盖一个带有一个特殊方格的棋盘,特殊方块上不能覆盖骨牌,其他方块上必须有骨牌覆盖,且任意两个骨牌不能重叠覆盖。
解决思路
1、 使用一个二维数组表示棋盘并初始棋盘的每个元素为0
在放置骨牌时同一个骨牌所占的三个方块置为同一个数
因为数组下标是从0开始的原因,所以我们在第一次传入用户所输入的值时刻意减掉一
2、 我们把棋盘分为左上,左下,右上,右下四个区域,分开去处理这四个区域
在处理左上时,根据方块的坐标判断特殊方块是否在此区域内,如果在,那么再递归调用棋盘覆盖函数,如果不在,那么在
此区域的右下角(也就是最靠近棋盘中心的位置)放置骨牌的三分之一。将此方块当作特殊方块,再把这个区域当作棋盘调用棋盘覆盖函数
处理其他三个区域时原理相同。
到棋盘为1x1时便退出。
代码实现
1 | #include <stdio.h> |
感谢阅读,欢迎指正。