棋盘覆盖问题

  1. 问题叙述
    在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

图示:

实例:

2. 基本思路:
关注的重点是特殊方格,2k2k的棋盘上如果没有特殊点,那么L型骨牌不可能完全覆盖,那么我们分治的思路是,每一个父棋盘分解为4个相同大小的子棋盘,除了本身就有特殊点的一个子棋盘,为另外三个棋盘人工设置3个特殊点,以此满足递归条件;基本情况是11棋盘,直接返回。

  1. 算法
//tr,tc为当前棋盘的左上角行号列号,dr,dc为特殊点行号列号,size是大小
CHSEEBOARD (tr, tc, dr, dc, size):if size==1 return
//tile是一个全局变量,它不满足递归,用于对人工设置的三个特殊点标记相同的数字t=++tile
//左上角if dr<tr+s && dc<tc+sCHESSBOARD (tr, tc, dr, dc, s)elseboard[tr+s-1][tc+s-1] = t;CHESSBOARD (tr, tc, tr+s-1, tc+s-1, s);
//左下角if dr>=tr+s && dc<tc+sCHESSBOARD (tr+s, tc, dr, dc, s)elseboard[tr+s][tc+s-1] = t;CHESSBOARD (tr+s,tc,tr+s,tc+s-1,s);
//右上角if dr<tr+s && dc>=tc+sCHESSBOARD (tr, tc+s, dr, dc, s)elseboard[tr+s-1][tc+s] = t;CHESSBOARD (tr, tc+s, tr+s-1, tc+s, s);
//右下角if dr>=tr+s && dc>=tc+sCHESSBOARD (tr+s, tc+s, dr, dc, s)elseboard[tr+s-1][tc+s-1] = t;CHESSBOARD (tr+s, tc+s, tr+s, tc+s, s);
  1. 复杂度:O(n^2)
    T(1)=1
    T(n)=4T(n/2)+1
    =>T(n)=O(n^2)

  2. 运行截图
    8*8棋盘

  3. 源代码

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;int tile = 0;
void chessBoard(vector<vector<int>> & board,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(board,tr,tc,dr,dc,s);else{board[tr+s-1][tc+s-1] = t;chessBoard(board,tr,tc,tr+s-1,tc+s-1,s);}//左下 if(dr>=tr+s && dc<tc+s)chessBoard(board,tr+s,tc,dr,dc,s);else{board[tr+s][tc+s-1] = t;chessBoard(board,tr+s,tc,tr+s,tc+s-1,s);}//右上 if(dr<tr+s && dc>=tc+s)chessBoard(board,tr,tc+s,dr,dc,s);else{board[tr+s-1][tc+s] = t;chessBoard(board,tr,tc+s,tr+s-1,tc+s,s);}//右下 if(dr>=tr+s && dc>=tc+s)chessBoard(board,tr+s,tc+s,dr,dc,s);else{board[tr+s][tc+s] = t;chessBoard(board,tr+s,tc+s,tr+s,tc+s,s);}
}void Print(const vector<vector<int>> &board)
{int n= board.size();for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout<<setw(2)<<left<<board[i][j]<<" ";}cout<<endl;}
}int main(int argc, char** argv) {vector<vector<int>> board;board.resize(8);for(int i=0;i<board.size();i++){board[i].resize(8);}board[3][3] = 0;chessBoard(board,0,0,3,3,board.size());Print(board); return 0;
}

注:文章中的示例及L型骨牌图片来自于
https://blog.csdn.net/yew1eb/article/details/8776985

2k*2k 棋盘覆盖问题相关推荐

  1. 棋盘覆盖问题详解(递归)

    棋盘覆盖问题详解(分治,非递归) (代码由 java 编写) 1.问题描述 如图(a)所示,k>0时,有一个2k×2k的棋盘,棋盘中任意位置有一个特殊的方格,要求利用图(b)中的4中L型骨牌覆盖 ...

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

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

  3. 棋盘覆盖问题C++版

    经典的棋盘覆盖问题描述如下:有一个2k∗2k的方格棋盘,有一个方格为特殊方格,除此方格外其余的方格可用L型骨牌覆盖,且任意一个方格不能同时被两个或更多骨牌覆盖. 棋盘覆盖问题可以用递归思想,因为棋盘规 ...

  4. 棋盘覆盖问题C++求解

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

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

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

  6. 练习六(归并排序、第k小元素、棋盘覆盖、大整数乘法)

    文章目录 题目 数组合并 归并排序 第k小元素问题 找中位数 棋盘覆盖问题 大整数乘法 题目 数组合并 题目描述 编写一个程序,将两个有序数组合并成一个更大的有序数组,要求时间复杂度为O(n). 输入 ...

  7. 棋盘覆盖(java实现)

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

  8. 【Java】棋盘覆盖问题

    棋盘覆盖问题抓住两点即可: 1.我们将一个大棋盘C分为四块,C的左上角是坐标是(0,0) 这个左上角坐标是用来区分在哪一个小棋盘的,抓住这个左上角的坐标变化 2.我们需要将没有特殊数字的其他三块继续分 ...

  9. 棋盘覆盖问题--分治策略

    问题描述: 在一个2k×2k (k≥0,k为上标)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格.棋盘覆盖问题要求用图(b)所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外 ...

最新文章

  1. springcloud学之前需要掌握什么_学国画之前我们需要准备什么?
  2. MYSQL韩文显示正常一法
  3. Altium designer中设置PCB网络闭合(不闭合)
  4. 输出torch构建的模型结构
  5. webpack4.0各个击破(3)—— Assets篇
  6. STM32F103xxx大容量增强型芯片之间有什么区别?(来自STM32神舟系列)
  7. spark官方文档_Spark机器学习之Pipeline
  8. 中国中央空调行业竞争力策略及未来发展潜力预测报告2021年版
  9. Python中的时间序列数据可视化的完整指南
  10. 50个高端大气上档次的管理后台界面模板
  11. unity3d Space Game太空射击游戏资源包
  12. 大神详解开源 BUFF 增益攻略丨直播
  13. 利用CSS3实现图片3D旋转
  14. 自己决定,玩客云到底要不要买
  15. 舟山景区概况 舟山旅游项目介绍
  16. win10如何设置锁屏时间
  17. Hu不变矩+BP神经网络,实现对图像的分类(pytorch实现)
  18. 蚂蚁金服通讯框架学习一
  19. 已知两点求直线一般方程、点到直线距离、点是否在线上方/下方
  20. c++计算两个三维向量之间的夹角

热门文章

  1. 在设计四人抢答器中灯全亮_数电课设四路抢答器的设计
  2. 汉诺塔问题——分治思想
  3. iOS PerformSelector 遗漏问题
  4. 运筹系列16:routing模型之VRP问题
  5. 基于单片机的自动追日系统设计_一种太阳能光伏支架自动追日系统的制作方法...
  6. python表达式323的值为_转: Python 运算符与用法
  7. (附源码)ssm医护服务平台 毕业设计 260954
  8. PAT甲级 2019年冬季 题解
  9. mysql 动态sql 解析_MyBatis详解5.动态SQL
  10. CSS面试题总结,助(祝)2021成功拿到offer