棋盘覆盖算法

棋盘覆盖问题探讨了一种使用L型骨牌覆盖(2^k)*(2^k)棋盘的方法,要求覆盖所有非特殊方格,且不重叠。文章介绍了分治策略,通过递归将棋盘不断划分,直至达到2x2的小棋盘,进而完成覆盖。在每个递归步骤中,特殊方格会改变,以此推进覆盖过程。文中还给出了具体的代码实现。
摘要由CSDN通过智能技术生成

题目介绍
在一个(2^k)*(2^k)个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格。
所以有4^k的次方中不同的特殊棋盘。
在棋盘覆盖中我们有四种L型骨牌,要求是使用这些骨牌,覆盖完全棋盘上除特殊位置以外的所有位置,并且任何两个L型骨牌不得重叠覆盖。
在任何一个(2^k)*(2^k)的棋盘覆盖中,用到的L型骨牌个数恰为(4^k-1)/3。

思路如下:
采用分治的思想,假设是8*8矩阵
(1)先划分为4块,如果给出的特殊位置在第一个方块内,先给中心的四个结点中其余三块赋值
(2)对于第一块,进行递归查找,如果还可以继续分,则继续划分下去,直到划分到size=2,这时候就是四个结点,给其余三个结点赋值
(3)在以上递归过程中,任何一个被赋值的点可以看作是下一个特殊位置,从而从这个特殊位置出发然后就可以继续去覆盖棋盘
代码实现如下

#include <iostream>
#include <iomanip>

using namespace std;

const int N = 8;
typedef int Array[N][N];

void Print_2Array(Array ar)
{
    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            cout << setw(3
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值