问题描述参考网站:
https://github.com/huihut/interview/tree/master/Problems/ChessboardCoverageProblem
程序流程:
代码:
main.cpp
/*
在一个2^k * 2^k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格。
棋盘覆盖问题就是要用图示的4种不同形态的L型骨牌覆盖给定棋盘上除特殊方格之外的所有方格,且任何2个L型骨牌不得重叠覆盖。
参考网址:https://github.com/huihut/interview/tree/master/Problems/ChessboardCoverageProblem
分析
初始全0二维矩阵,放了棋子的位置改为1
分治递归
*/
#include <iostream>
#include <ctime>
#include"array2d.h"
#define array2d array2d<int>
using namespace std;
//子矩阵结构体
struct sub_array
{
int row_start;
int col_start;
int length;
};
//格子结构体
struct point
{
int r;
int c;
};
//产生随机数函数
int randnum(int max_v) {
return rand() % max_v;
}
//初始化
void initialize(array2d& a, int k) {
//维数
int n = pow(2, k);
//产生两个随机数,作为初始黑格的位置
int row = randnum(n);
int col = randnum(n);
//生成二维数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (row == i && j == col)
a.at[i][j] = 1;
else
a.at[i][j] = 0;
}
}
}
//判断子矩阵中是否有非零值
bool have_chess(const array2d& a, sub_array sa) {
for (int r = 0; r < sa