《数据结构、算法与应用 —— C++语言描述》学习笔记 — 分治算法 — 残缺棋盘

本文是关于《数据结构、算法与应用 —— C++语言描述》的学习笔记,重点讨论了如何使用分治算法解决残缺棋盘问题。残缺棋盘是指2k×2k大小的棋盘缺少一个方格,要求用三格板覆盖,且不覆盖残缺方格。通过将大棋盘划分为四个小棋盘,逐步解决。文中还展示了实现过程,包括覆盖算法和QT绘图代码的关键部分。
摘要由CSDN通过智能技术生成

《数据结构、算法与应用 —— C++语言描述》学习笔记 —分治算法

一、 问题描述

残缺棋盘是一个有 2 k ∗ 2 k 2^k*2^k 2k2k个方格的棋盘,其中恰有一个方格残缺,如图为两个 k=2 的残缺棋盘:
在这里插入图片描述
在残缺期盼中,要求用三格板覆盖残缺棋盘。在覆盖中,任意两个三格板不能重叠,任意一个三格板不能覆盖残缺方格,但三格板必须覆盖其他所有方格。在这种限制条件下,所需的三格板总数为 ( 2 2 k − 1 ) / 3 (2^{2k}-1)/3 (22k1)/3。四种三格板的形状如图:在这里插入图片描述

二、求解策略

使用分而治之算法,可以很好地解决残缺棋盘问题。把 2 k ∗ 2 k 2^k*2^k 2k2k个方格的棋盘实例划分为较小的残缺棋盘实例。一个自然的划分结果是四个 2 k − 1 ∗ 2 k − 1 2^{k-1}*2^{k-1} 2k12k1棋盘。然后,我们可以通过在子棋盘的适当位置插入残缺方格使它们转变为残缺棋盘。假设原棋盘的残缺方格位于左上角的子棋盘中,那么其分割结果如图:
在这里插入图片描述

三、实现

考虑到棋盘分割结果的呈现,我们使用QT简单做一个分割。绘图代码多来源于我们前面实现的迷宫老鼠应用,我们这里只列出一些关键代码。

1、覆盖算法实现

这个算法还是比较简单的,一种情况实现了其他的都好办。

#ifndef PUTTILE_H
#define PUTTILE_H
#include <QVector>
#include <QPoint>

class PutTile
{
   
public:
    enum TileType
    {
   
        noRBTile,
        noLBTile,
        noLTTile,
        noRTTile
    };
    typedef std::pair<QPoint, TileType> pointAndTile;
    /*
     * @brief 放置三格板
     * @param rowOfDefeat 残缺方格的行
     * @param columnOfDefeat 残缺方格的列
     * @param startRow 当前方格的起始列
     * @param startColumn 当前方格的起始列
     * @param size 当前方格的大小
     */
    QVector<pointAndTile> putTile(int rowOfDefeat, int columnOfDefeat,
            int startRow, int startColumn, int size);
};

#endif // PUTTILE_H

// PutTile.cpp
#include "PutTile.h"

QVector<PutTile::pointAndTile>
PutTile::putTile(int rowOfDefeat,<
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值