棋盘覆盖问题是一个经典的分治问题的算法,它其中的思想,就是分而治之。

怎么体现分而治之的思想是这个问题的关键。

首先,将棋盘分为四个小的方块,体现了分,但是却破坏了问题的统一性,因为小的方块中,三个块中没有特殊的方块。

所以为了不破坏分而不乱的思想,我们可以在每一个小块中加一个特殊的小方块,但是加一个小方块,随便填的话,同样还是破坏了分的目的,故,书本上给出了一种比较高明的技巧,在没有特殊块的方块中,将一个L型的块放到三个块的交界处,一来,这是一种往棋盘填块的方式,不破坏题意的目的,二来,又增加了其他三个无特殊块的方格,三个特殊方格。可谓是一举两得,这样使得分开之后的问题与原问题是一样的,只有这样才可以用分治法来处理。

下面上代码同样的,使用了c++代码

//棋盘覆盖
#include<iostream>
#include<cstring>
#include<cstdlib>
#define SIZE 8
using namespace std;
int Board[SIZE][SIZE];//棋盘坐标
int kind;             //放置牌的种类
void ChessBoard(int tr,int tc,int dr,int dc,int size){if(size==1)return;int t=kind++;int s=size/2;// 从左上角的方块开始检查 if(dr < tr + s&&dc < tc + s)//特殊块在该区域,就直接递归 ChessBoard(tr,tc,dr,dc,s);else{                       //特殊块不在该区域,则在右下角放一小块然后递归 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{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{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{Board[tr+s][tc+s]=t;ChessBoard(tr+s,tc+s,tr+s,tc+s,s);}}int main(){memset(Board,0,sizeof(Board));//棋盘初始化为0 cout<<"Initnation the Board!The curent sutation is:"<<endl;for(int i = 0;i < SIZE;i ++){for(int j = 0;j < SIZE;j ++)cout<<Board[i][j]<<" ";cout<<endl;}                          //打印当前的棋盘状态 cout<<"The chessboard is covered..."<<endl;ChessBoard(0,0,0,3,SIZE);       //开始放置 cout<<"The chessboard is:"<<endl;cout.fill('0');                 //用0填充空白 for(int i = 0;i < SIZE;i ++){for(int j = 0;j < SIZE;j ++){cout.width(2);              //便于查看控制字符为两个空白的宽度 cout<<Board[i][j]<<" ";}cout<<endl;}system("pause");}

ChessBoard棋盘覆盖问题相关推荐

  1. 分治策略------棋盘覆盖(ChessBoard)

    棋盘覆盖原理 棋盘覆盖运用的是分治策略. 1.分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题. 2.k>0时, ...

  2. 递归与分治之棋盘覆盖问题

    在一个2^k * 2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘. 显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不 ...

  3. [算法][递归] 棋盘覆盖

    >_<: 问题描述: 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘.在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖 ...

  4. 算法设计棋盘覆盖问题c语言,棋盘覆盖问题(用分治法求解)

    // 棋盘覆盖 #include #include int Board[8][8]={0};//定义棋盘并初始化棋盘 void ChessBoard(int tr,int tc,int dr,int ...

  5. 算法设计与分析——递归与分治策略——棋盘覆盖

    问题描述 棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中,你给定任意一个特殊点,用一种方案实现对除该特殊点的棋盘实现全覆盖. 建立模型如图: 解决方案就是利用分治法,将方形棋盘分成4部分,如 ...

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

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

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

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

  8. python棋盘覆盖_java实现的棋盘覆盖

    课课家和大家分享一些Java实现的棋盘覆盖的思路:应用分治法 分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题.k&g ...

  9. 算法笔记 分治:循环赛日程 棋盘覆盖 选择问题 输油管问题 整数因子分解

    一.循环赛日程 #include <iostream> #include <vector> #include <string> #include <algor ...

最新文章

  1. ioctl kernel 构建注意事项
  2. html5如何让保存的信息立即显示出来,如何用HTML5存储用户输入的信息
  3. 转工厂方法模式-想吃什么汉堡自己要
  4. pytorch基础知识整理(四) 模型
  5. Linux下PostgreSQL基础操作
  6. 卷积神经网络(CNN)与特殊的卷积
  7. 让电脑清空数据或死机,一定要执行才舒服
  8. XML(1):基于流的XML处理
  9. 数据可视:让科幻走向现实
  10. HTML 5 span 标签
  11. Mac电脑如何让聚焦功能显示在菜单栏?
  12. 论文笔记_S2D.35-2017-IROS_利用CNNs联合预测RGB图像的深度、法线和表面曲率
  13. 微软服务器探针产品,服务器云探针
  14. 抽奖随机滚动_年会抽奖该怎么玩?
  15. 百度文库,道客巴巴等文库免积分下载
  16. DDIA - 第5章 数据复制
  17. 计算机语言缩写 dos,dos是什么意思 dos缩写中英全称是什么
  18. python校园排课选课系统毕业设计开题报告
  19. EVE-NG镜像导入(Dynamipshe和IOL)
  20. 项目:文件搜索助手(FileSeeker)

热门文章

  1. 关于twitter爬虫的总结
  2. apk包的破解与反编译
  3. 计算机原码 反码 和 补码
  4. Windows 或 Windows 服务器上的 hyper-v 中升级虚拟机版本
  5. 电路中的VCC是什么意思?
  6. linux的浏览器大全,Linux下9款浏览器对比
  7. CNCC 2018 经典计算机算法技术论坛全解读 | CNCC 2018
  8. linux虚拟机怎么联网
  9. android edittext的属性
  10. PTA:一帮一(C语言)