实验七 棋盘覆盖

算法报告七 棋盘覆盖

                                                               16122020   钟顺源

一、题目大意

设n= 2 k 2^k 2k(k≥0)。在一个n×n个方格组成的棋盘中,恰有1个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4k种,因而有n2种不同的棋盘,下图所示是k=2,n=4时16种棋盘中的一个。
                                实验七 棋盘覆盖_第1张图片
棋盘覆盖问题要求用下图所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
             实验七 棋盘覆盖_第2张图片
易知,在任何一个n×n的棋盘中,用到的 L 型骨牌个数恰为 ( n 2 − 1 ) / 3 (n^2-1)/3 (n21)/3
你的任务是给定k>1,n= 2 k 2^k 2k设计一个算法实现棋盘的一种覆盖。

二、分析

对于要解决的问题,例如下述的一张图
实验七 棋盘覆盖_第3张图片
将他分为四块,则左上角的一个小区域可以递归求解,那么其他区域呢?
实验七 棋盘覆盖_第4张图片

只要在其他的方格的边界都加上一个黑块,就可以在填入一个黑块的前提下,将其他的区域也递归求解。
实验七 棋盘覆盖_第5张图片
所以递归方程就是 T(n) = 4T(n/4)+O(1),复杂度为O(nlogn)。

问题就转换成了判断已经标号的方块在四个区域中的那个区域中。
递归到长度为1时就直接返回。

三、代码

#include
using namespace std;
const int N=1e3;
int G[N][N];
int flag=0;
inline bool judge(int sx,int sy,int len,int bx,int by){
    return sx<=bx&&bx

四、运行结果

数据
1 2 1
2 2 3
3 1 1

实验七 棋盘覆盖_第6张图片

五、实验体会

   这是个经典的递归程序,有很多的细节需要考虑,比如填色的计数器该如何设置,作为参数传递下去?还是作为一个全局变量?还有如何判断已经染色的方格的位置?虽然思路比较简单,但真正判断起来还是要非常仔细的,一些边界值要仔细的计算。

你可能感兴趣的:(实验七 棋盘覆盖)