一、引子
近期又又一次上了算法课,如今想来有点汗颜。大学期间已经学习了一个学期。到如今却依旧感觉仅仅是把老师讲过的题目弄懂了,并没有学到算法的一些好的分析方法和思路,碰到一个新的问题后往往感觉非常棘手,痛定思痛之后认为还是好好再学习一遍。争取能理解透彻每种算法的思路和核心,同一时候也劝诫各位同行们做事要脚踏实地,不能应付老师的作业,最后吃亏的还是自己啊。
二、棋盘覆盖问题
三、解题思路
如果特殊格子出如今(0,2)这个位置,如图3所看到的,那么对于含有特殊格子的右上角的子棋盘我们用0型骨牌填充,如图4。那么剩余的三个子棋盘呢,这个时候我们发现左上角仅仅能覆盖3型和2型,其它两种会有剩余空格。如果覆盖2型骨牌,后面的左下角必定无法全然覆盖(自己能够试一下),则仅仅能使用3型骨牌覆盖,以此类推,我们也能够覆盖左下角和右下角此时仅仅剩三个格子没有覆盖,如图5所看到的。
如今细致观測剩余的三个格子,我们发现他们都是分开在三个子棋盘里。那么这些空格子在子棋盘中是无法直接被覆盖的,由于每一个子棋盘仅仅剩一个空格子了,我们是不是能够把这个空格子当成一个特殊格子,这样四个子棋盘都是含有一个特殊格子的小棋盘。这样原问题就变成了四个相同的子问题,再求解了每一个子棋盘后,我们再对三个假的子棋盘格子进行覆盖(如图6)。
那么怎样选择空格作为子棋盘的特殊格子呢。通过观察我们发现,对于含有特殊格子的子棋我们不用指定特殊格子,对于剩下三个子棋盘,我们指定四个子棋盘的交界处的格子作为特殊格子。
四、归纳
五、代码实现
#include#include using namespace std;int **chessBoard;int k=1;int length=0;int blueRow=-1;int blueCol=-1;void init();void fillBoard(int **_chessBoard,int r,int c,int type);void fillChessBoard(int **_chessBoard,int k,int blue_row,int blue_col,int baseRow,int baseCol);void output(int **_chessBoard);int main(){ init(); fillChessBoard(chessBoard,k,blueRow,blueCol,0,0); output(chessBoard); for(int i=0;i >k; cout<<"please input blue grid coordinate:row column"< >blueRow>>blueCol; length=(1<
六、代码解释
fillBoard()函数是使用某种L型骨牌覆盖棋盘的函数。fillChessBoard()是递归求解整个问题的函数,输入为棋盘指针。參数level也就是k。blue_row,blue_col是特殊格子在子棋盘的坐标系的位置,baseRow和baseCol是子棋盘的(0,0)点在整个的大棋盘中的坐标。