在一个2^k × 2^k (k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4^k 种,因而有 4^k种不同的棋盘,图4.10(a)所示是k=2时16种棋盘中的一个。棋盘覆盖问题(chess cover problem)要求用图4.10(b)所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

棋盘覆盖问题采用分治策略求解,将棋盘递归的向下划分,如4x4的棋盘首先划分为4个2x2的棋盘,再将每个2x2的棋盘划分为4个1x1的棋盘。分治的基本思想是划分为同样的子问题求解,但是这要怎么划分呢,特殊的点只有一个,如果这样划分不就不一样了吗?不一样就要变成一样,当我们划分为4个4x4时,
只有左上有特殊点,而其余三个都没有,这时我们就要构造特殊点,用一个L型骨牌覆盖:

这样我们把红色的棋盘也当成特殊点,再进行递归就可以了。

#include<bits/stdc++.h>
using namespace std;
int mp[50][50];
int cnt = 0;
//zx,zy为当前棋盘的左上角坐标,spx,spy为特殊点的坐标。
void dfs(int zx,int zy,int spx,int spy,int size)
{if(size == 1)//如果划分到只剩1个棋盘了,就直接退出return ;int t = ++cnt;//骨牌号int s = size/2;//下一次递归的棋盘大小//printf("1");// 如果特殊点在划分棋盘后的左上部分if(zx+s > spx && zy+s > spy) //left top{//直接划分,不用覆盖dfs(zx,zy,spx,spy,s);}else {//否则就在左上部分的右下角覆盖,继而将覆盖的点当作特殊点,继续划分//(配合上面的图理解)mp[zx+s-1][zy+s-1]=t;dfs(zx,zy,zx+s-1,zy+s-1,s);}// 如果特殊点在划分棋盘后的右上部分if(zx+s > spx && zy+s <= spy) //right top{//直接划分,不用覆盖dfs(zx,zy+s,spx,spy,s);}else{//否则就在右上部分的左下角覆盖,继而将覆盖的点当作特殊点,继续划分mp[zx+s-1][zy+s]=t;dfs(zx,zy+s,zx+s-1,zy+s,s);}// 如果特殊点在划分棋盘后的左下部分if(zx+s <= spx && zy+s >spy) //left bottom{//直接划分,不用覆盖dfs(zx+s,zy,spx,spy,s);}else{//否则就在左下部分的右上角覆盖,继而将覆盖的点当作特殊点,继续划分mp[zx+s][zy+s-1]=t;dfs(zx+s,zy,zx+s,zy+s-1,s);}// 如果特殊点在划分棋盘后的右下部分if(zx+s <= spx && zy+s <= spy) //right bottom{//直接划分,不用覆盖dfs(zx+s,zy+s,spx,spy,s);}else{//否则就在右下部分的左上角覆盖,继而将覆盖的点当作特殊点,继续划分mp[zx+s][zy+s]=t;dfs(zx+s,zy+s,zx+s,zy+s,s);}
}
int main()
{int n;int spx,spy;scanf("%d",&n); //输入棋盘的大小int size = n;scanf("%d%d",&spx,&spy); //输入特殊点的位置dfs(0,0,spx,spy,size); //棋盘覆盖for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){printf("%5d ",mp[i][j]);}printf("\n\n");}
}

算法设计与分析----棋盘覆盖相关推荐

  1. 算法设计与分析--棋盘覆盖问题解决思想

    问题:在一个2^k * 2^k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,则称该棋盘为一特殊棋盘.该棋盘为特殊棋盘,蓝色的方格为特殊方格.要用图2中的4种不同形态的L型骨牌覆 ...

  2. 算法设计与分析课程的时间空间复杂度

    算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...

  3. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案

    <计算机算法设计与分析>习题及答案 一.选择题 1.二分搜索算法是利用( A )实现的算法. A.分治策略 B.动态规划法 C.贪心法 D.回溯法 2.下列不是动态规划算法基本步骤的是( ...

  4. 计算机算法设计与分析教学大纲,《算法设计与分析》教学大纲

    <<算法设计与分析>教学大纲>由会员分享,可在线阅读,更多相关<<算法设计与分析>教学大纲(3页珍藏版)>请在人人文库网上搜索. 1.课程编号:&quo ...

  5. 算法设计与分析之分治法

    文章目录 前言 一.分治法设计思想 二.分治法与递归 三.分治法的适用条件 四.时间复杂度分析 五.分治法设计步骤 六.分治法示例 总结 前言 大家好,我是一只勤勤恳恳的程序猿.本篇文章小猿将跟您分享 ...

  6. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  7. 算法设计与分析(python版)-作业三

    参考教材:算法设计与分析(Python版)         作者:王秋芬 1 . 普通 (5分)以下问题中,哪些问题的分治算法消耗的时间与输入序列无关.() A. 二分查找 B. 合并排序 C. 快速 ...

  8. 算法设计与分析实验指导(完整版)

    算法设计与分析实验指导 文章目录 算法设计与分析实验指导 1. 快速排序及第k小数 1.1 快速排序 1.1.1 Implementation 1 1.1.2 算法特性分析 1.1.3 Improve ...

  9. 计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)

    计算机算法设计与分析(第4版) 目录 1 算法概述 2 递归与分治策略 3 动态规划 4 贪心算法 5 回溯法 6 分支限界法 7 随机化算法 8 线性规划与网络流 算法概述 复杂性分析 NP-完全性 ...

最新文章

  1. JavaScript DOM编程艺术 - 读书笔记1-3章
  2. 文件操作2-Day3
  3. Leetcode每日一题:110.balanced-binary-tree(平衡二叉树)
  4. Could not resolve this reference. Could not locate the assembly
  5. mysql 主主复制
  6. Linux学习总结(四)-两种模式修复系统,单用户,救援模式
  7. P1403 [AHOI2005]约数研究
  8. 【转】使用cocos2d-console工具转换脚本为字节码
  9. 开发erp管理系统的好处
  10. 牛课网--直通BAT面试算法精讲课--送优惠码啦
  11. 【百度地图2.5D、3D在Vue项目中的使用】嵌入二维百度地图、三维百度地图、多种显示模式风格样式颜色的百度地图
  12. 《我是一只小小鸟》读后感
  13. 机械制造作业考研题目答案分享——回转体的加工
  14. win11下30系列显卡配置anaconda虚拟环境cuda,cudnn,pytorch
  15. 国产蓝牙耳机哪款值得入手?高性价比游戏低延迟蓝牙耳机推荐
  16. 如何下载企业微信上课直播回放
  17. Python办公自动化之Word文档自动化:全网最全,看这一篇就够了!
  18. 如何设置maya的Render.exe程序来mayabatch批量渲染
  19. 全新天龙八部:4年积攒更惬意的方法
  20. pygame 大球吃小球

热门文章

  1. 公众号榜单 | 2020·4月公众号原创排行榜重磅发布
  2. mysql pxc集群介绍_PXC集群的概述及搭建
  3. 无胁科技-TVD每日漏洞情报-2022-11-30
  4. spring boot + maven使用profiles进行环境隔离
  5. 腾讯云轻量应用服务器配置表汇总2核2G/2核4G/4核8G/8核16G!
  6. 新浪sae平台wordpress中Buddypress插件上传头像问题
  7. JavaScript之事件触发on和事件监听addEvent及addEventListener的区别和作用
  8. 作为技术负责人,如何从0搭建公司后端技术栈
  9. 新华都总裁兼CEO给唐骏留言
  10. 报告论文:汽车GPS调度系统车载终端设计技术方案