棋盘覆盖-经典的分治法问题

  • 一、问题概述
  • 二、适用方法
  • 三、代码展示
  • 四、运行结果
  • 五、算法分析

一、问题概述

在一个 2k×2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,称该方格为特殊方格,且称该棋盘为特殊棋盘(Defective Chessboard)
特殊方格在棋盘中出现的位置有 4k种情形,就有4k种不同的棋盘。
图中的特殊棋盘是当 k=2时16个特殊棋盘中一个。在棋盘覆盖问题中,要求用图所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何两个L型骨牌不得重叠覆盖。在任何一个个 2k×2k的棋盘覆盖中,用到的L型骨牌个数为 (4k-1)/3。

二、适用方法

用分治策略,可以设计解棋盘覆盖问题的一个简捷算法。分治的技巧在于如何划分棋盘,使划分后的子棋盘大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。
(1)当k>0时,将2k×2k的棋盘划分为4个2k-1×2k-1子棋盘。
(2)原棋盘只有一个特殊方格,则其余3个子棋盘中没有特殊方格。
(3)用一个L型骨牌覆盖这3个较小棋盘的会合处。从而将原问题转化为4个较小规模的棋盘覆盖问题,以便采用递归方法求解。
(4)递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。

三、代码展示

static int tile = 1;
static int board[8][8];
void ChessBoard(int tr,int tc,int dr,int dc,int size){if (size == 1) return;int  t = tile++;int  s = size/2;// 覆盖左上角子棋盘if (dr<tr+s && dc<tc+s) {// 特殊方格在此棋盘ChessBoard(tr,tc,dr,dc,s);} else {// 此棋盘中无特殊方格,用t号L型骨牌覆盖右下角board[tr+s-1][tc+s-1] = t;// 覆盖其余方格ChessBoard(tr,tc,tr+s-1,tc+s-1,s);}// 覆盖右上角子棋盘if (dr<tr+s && dc>=tc+s) {//        特殊方格在此棋盘ChessBoard(tr,tc+s,dr,dc,s);} else {// 此棋盘中无特殊方格,用t号L型骨牌覆盖右上角board[tr+s-1][tc+s] = t;// 覆盖其余方格ChessBoard(tr,tc+s,tr+s-1,tc+s,s);}// 覆盖左下角子棋盘if (dr>=tr+s && dc<tc+s) {//  特殊方格在此棋盘ChessBoard(tr+s,tc,dr,dc,s);} else {//  此棋盘中无特殊方格,用t号L型骨牌覆盖左下角board[tr+s][tc+s-1] = t;//  覆盖其余方格ChessBoard(tr+s,tc,tr+s,tc+s-1,s);}// 覆盖右下角子棋盘if (dr>=tr+s && dc>=tc+s) {//  特殊方格在此棋盘ChessBoard(tr+s,tc + s,dr,dc,s);} else {// 此棋盘中无特殊方格,用t号L型骨牌覆盖右下角board[tr+s][tc+s] = t;// 覆盖其余方格ChessBoard(tr+s,tc+s,tr+s,tc+s,s);}
}int main() {ChessBoard(0,0,1,1,8);for(int i = 0;i< 8;i++) {for (int j = 0; j<8;j++) {cout<<board[i][j] << "\t";}cout << endl;}return 0;
}

四、运行结果


上图里面的细线是后面在截图上添加进去的,画这个线的为了表述清楚棋盘分治,其中0代表特殊点,其他每个数字代表一种L型骨牌。

五、算法分析


上图展示分治法解决棋盘问题需要的时间复杂度,算法的空间复杂度是:o(1)
个人理解与总结:棋盘覆盖问题是一个经典分治法问题,这里面分治的技巧在于如何划分棋盘,使划分的棋盘大小相同,且每个子棋盘包含一个特殊方格,从而将一个大的棋盘覆盖问题划分为四个较小的棋盘覆盖问题,这样可以分别得到较小的棋盘覆盖的结果,将较小的子棋盘又划分为四个更小的子棋盘,按照这种方法递归下去一直到只有最后一个2x2的棋盘,为什么是2x2呢,因为最后要保证有一个特殊方格然后加上其他三个方格要被L型骨牌覆盖掉。
优点:经典分治法问题,分治法太契合了。
缺点:看起来没啥缺点,其实就是递归的一个通病,当递归层数太多,要是棋盘的k值很大很大,这个问题消耗的时间就很多了。

棋盘覆盖-经典的分治法问题相关推荐

  1. 棋盘覆盖问题(分治法)

    问题描述 有一个 x (k>0)的棋盘,恰好有一个方格与其他方格不同,称之为特殊方格.现在要用如下图所示的L形骨牌覆盖除了特殊方格以外的其他全部方格,骨牌可以任意旋转,并且任何两个骨牌不能重复. ...

  2. python棋盘覆盖问题_棋盘覆盖问题可视化动图——python

    棋盘覆盖问题可视化动图--python 棋盘覆盖问题是一个经典的分治法解决的问题,具体内容可以参照以下博主的解析 为了更好的理解该算法分治的过程 利用了python中的matplotlib库进行了该算 ...

  3. 算法与数据结构-分治法

    分治法 分治法的思想 将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治模式在每层递归时都有三个步骤: 分解(Divide):将原 ...

  4. 分治法:快速排序棋盘覆盖

    目标 使用分治法解决快速排序问题 使用分治法解决棋盘覆盖问题 原理 一.快排原理 排序算法在工作中最常用,也是学习很多其他算法的前置知识,例如在运用二分查找算法之前,我们通常需要保证数据是有序的,如果 ...

  5. 分治法--棋盘覆盖问题

    前几天学分治算法的时候碰到了一个经典的棋盘覆盖问题,现在小周周就来总结一下解题的过程吧,加强我们对分治算法的理解. 棋盘覆盖问题 问题描述:在一个2的K次方乘以2的K次方方格组成的棋盘中,一开始恰有一 ...

  6. 棋盘覆盖-分治法(代码实现)

    这是棋盘覆盖的代码实现,至于原理,请参考我的上一篇博客:棋盘覆盖问题-分治法 实现的效果如下: 或者如下: 其中0表示递归过程中标记的所有奇异点 实现代码如下: //棋盘大小size, 奇异点的坐标( ...

  7. 分治法——棋盘覆盖问题/L形组件填图问题(Java实现)

    问题描述 设B是一个n×n棋盘,n=2k,(k=1,2,3,-).用分治法设计一个算法,使得:用若干个L型条块可以覆盖住B的除一个特殊方格外的所有方格.其中,一个L型条块可以覆盖3个方格.且任意两个L ...

  8. java棋盘覆盖分治法,棋盘覆盖-分治法

    信 息 工 程 学 院 算法分析 实习报告 学院:信息工程学院 班级:软件工程083 姓名: 学号: 成绩: 一.实习题目 : 棋盘覆盖 二.实习过程 : 1.了解分治法的思想: 将一个难以解决的大问 ...

  9. 分治法解决棋盘覆盖问题

    分治法解决棋盘覆盖问题 问题描述: 在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格.显然,特殊方格在棋盘中出现的位置有4k中情形,因而有4k中不同的棋盘. ...

最新文章

  1. 软件测试-培训的套路-log3
  2. Nature子刊:涵盖20多万个基因组的人体肠道微生物参考基因组集
  3. windows Azure
  4. RabbitMQ核心概念
  5. 学python需要安装什么-初学 Python 需要安装哪些软件?
  6. aop阻止方法运行_Spring AOP无法拦截内部方法调用
  7. ldap集成nginx
  8. C++ STL : 模拟实现STL中的容器适配器stack和queue
  9. headerIP php_PHP使用curl伪造IP地址和header信息
  10. 部署到gcp_剖析大数据公司为什么选择 GCP?
  11. python抓取贴吧_Python抓取图片(贴吧)
  12. ARKit 和 ARCore概念介绍
  13. 安装企业微信和微信-ubuntu
  14. maven自带clean_maven install、maven clean、project clean
  15. TrinityCore魔兽世界服务器-环境搭建(Debian11)
  16. 最新联发科Helio X30(mt6799)芯片处理器详细资料(datasheet)
  17. python爬取网易云_利用python爬取网易云音乐,并把数据存入mysql
  18. mac查找字符串并替换
  19. 小程序中的页面导航(页面跳转)
  20. 埋点 神策小程序_神策埋点思路

热门文章

  1. 知识库--Ensure Atomicity 原子性保证(117)
  2. Gmail 设置收件白名单
  3. 伯恩斯新情绪疗法--克服无价值感
  4. 认知智能类脑模型之认知体系简介
  5. PostFX v2 –惊人的视觉效果,已升级
  6. idea服务器激活步骤(jetbrainsCrack.jar)
  7. 中学毕业自学编程黑客在阿里能不能年薪500万
  8. [win转mac]-mac安装autojump
  9. Boostnote笔记+坚果云|实现在线markdown笔记同步
  10. 面试官一看就想留下的简历,到底是怎么写的?