【算法】分治法的应用——棋盘覆盖问题

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法分析与设计知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


目录

  • 一、问题描述
  • 二、问题分析
  • 三、代码实现
  • 四、复杂度分析

一、问题描述

在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为特殊方格,且称该棋盘为特殊棋盘

在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

在这里插入图片描述

(证明该问题有解):

数学归纳法(mathematical induction)
当n=1时(2×2棋盘),该问题有解
假设当n=k时(2k×2k棋盘),该问题有解
那么当n=k+1时(2k+1×2k+1棋盘),将棋盘划分为2k×2k子棋盘,特殊方格位于4个子棋盘之一中,余3个子棋盘中无特殊方格

二、问题分析

利用分治法需要满足分治的条件

目前不符合将一个大问题分解成若干个与原问题相似的小问题,需要将问题进行转化

现在需要考虑如何将棋盘分为几个相同的子棋盘

我们可以将棋盘沿着它的中心进行划分,这样可以保证每个子棋盘的大小都是相同的

在这里插入图片描述

在这里插入图片描述

但是分出的棋盘中没有特殊方格,并不是特殊棋盘

如何将这3个无特殊方格的子棋盘转化为特殊棋盘?

用一个L型骨牌覆盖这3个较小棋盘的会合处,将原问题转换为`4个n=k`时的子问题,因为n=k时有解,所以n=k+1时也有解。

特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处

从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1

在这里插入图片描述

三、代码实现

#include<iostream>
using namespace std;int box[100][100];
int num = 0;
void chessBoard(int x, int y, int a, int b, int length) 
{//如果棋盘简化为1×1,该方格为一特殊方格if (length == 1){  return;}int h = length / 2;   //分割棋盘为原来的一半int t = ++num;        //L型骨牌号,从1开始//左上角if (a < x + h && b < y + h){   //特殊方格在此棋盘中chessBoard(x, y, a, b, h);   }else{   //覆盖右下角的方格再划分box[x + h - 1][y + h - 1] = t;chessBoard(x, y, x + h - 1, y + h- 1, h);}//右上角if (a < x + h && b >= y + h){  //特殊方格在此棋盘中chessBoard(x, y + h, a, b, h);}else{   //覆盖右下角的方格再划分box[x + h - 1][y + h] = t;chessBoard(x, y + h, x + h - 1, y + h, h);}//右下角if (a >= x + h && b >= y + h){  //特殊方格在此棋盘中chessBoard(x + h, y + h, a, b, h);}else{   //覆盖右下角的方格再划分box[x + h][y + h] = t;chessBoard(x + h, y + h, x + h, y + h, h);}//左下角if (a >= x + h && b < y + h){  //特殊方格在此棋盘中chessBoard(x + h, y, a, b, h);}else{   //覆盖右下角的方格再划分box[x + h][y + h - 1] = t;chessBoard(x + h, y, x + h, y + h - 1, h);}
}int main()
{//左上角方格:1行1列,特殊方格:4行2列,棋盘为8×8chessBoard(1, 1, 4, 2, 8);for (int i = 1; i <= length; i++){for (int j = 1; j <= length; j++){cout << box[i][j];}cout << endl;}return 0;
}

四、复杂度分析

由于覆盖一个2k×2k棋盘所需的L型骨牌个数为(4k-1)/3,故上述算法是一个渐近意义下的最优算法

在这里插入图片描述


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/98633.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-821题库(单选题:181-200)

第181题 某管理员需要创建AS Path过滤器(ip as-path-iter),允许AS_Path中包含65001的路由通过,那么以下哪一项配置是正确的? A、​​ip as-path-filter 1 permit 65001​​ B、​​ip as-path-filter 1 permit "65001​​ C、​​ip as-path-filter 1 permit *6500…

OC和Swift混编,导入头文件‘xxx-Swift.h‘ file not found

在OC的项目里加入Swift代码&#xff0c;创建完桥接文件后&#xff0c;需要倒入Swift头文件&#xff0c;头文件的格式为“项目名-Swift.h”。 如下图&#xff0c;我在Xcode上看到我的项目名为YichangPark&#xff0c;导入 #import "YiChangPark-Swift.h" 之后提示 “Y…

【笔记】软件测试的艺术

软件测试的心理学和经济学 测试是为发现错误而执行程序的过程&#xff0c;所以它是一个破坏性的过程&#xff0c;测试是一个“施虐”的过程。 软件测试的10大原则 1、测试用例需要对预期输出的结果有明确的定义 做这件事的前提是能够提前知晓需求和效果图&#xff0c;如果不…

Python小知识 - 1. Python装饰器(decorator)

Python装饰器&#xff08;decorator&#xff09; Python装饰器是一个很有用的功能&#xff0c;它可以让我们在不修改原有代码的情况下&#xff0c;为已有的函数或类添加额外的功能。 常见的使用场景有&#xff1a; a. 函数缓存&#xff1a;对于一些计算量较大的函数&#xff0c…

[移动通讯]【Carrier Aggregation in LTE】【 Log analysis-2】

前言&#xff1a; 接 [移动通讯]【Carrier Aggregation in LTE】【 Theory Log analysis-1】 这里面 主要讲解一下日志分析 目录&#xff1a; 总体流程 UE Capbaility Information MeasurementReport RRC Connection Reconfiguration RRCConnectionReconfiguration…

一阶多智能体的平均一致性

数学表达 一阶多智能体的运动学方程可以描述为 x ˙ i ( t ) u i ( t ) , i ∈ { 1 , 2 , 3 , … , N } \dot x_i(t) u_i(t),i\in\{1,2,3,\dots,N\} x˙i​(t)ui​(t),i∈{1,2,3,…,N} 其中 x i ( t ) x_i(t) xi​(t)为状态&#xff0c; u i ( t ) u_i(t) ui​(t)为控制量&…

leetcode:1941. 检查是否所有字符出现次数相同(python3解法)

难度&#xff1a;简单 给你一个字符串 s &#xff0c;如果 s 是一个 好 字符串&#xff0c;请你返回 true &#xff0c;否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 &#xff0c;那么我们称字符串 s 是 好 字符串。 示例 1&#xff1a; 输入&#xff1a;s…

华为数通方向HCIP-DataCom H12-821题库(单选题:261-280)

第261题 以下关于IPv6过渡技术的描述,正确的是哪些项? A、转换技术的原理是将IPv6的头部改写成IPv4的头部,或者将IPv4的头部改写成IPv6的头部 B、使用隧道技术,能够将IPv4封装在IPv6隧道中实现互通,但是隧道的端点需要支持双栈技术 C、转换技术适用于纯IPv4网络与纯IPv…

苹果微信聊天记录删除了怎么恢复?果粉原来是这样恢复的

粗心大意删除了微信聊天记录&#xff1f;有时候&#xff0c;一些小伙伴可能只是想要删除一部分聊天记录&#xff0c;但是在进行批量删除时&#xff0c;不小心勾选到了很重要的对话&#xff0c;从而导致记录丢失。 如果这时想找回聊天记录该怎么办&#xff1f;微信聊天记录删除…

2023年了,java后端还有未来吗?

前言 Java当下确实是比较的内卷&#xff0c;但关键在于个人&#xff0c;可以看看不同地方&#xff08;这里主要举例北上广深一线城市&#xff09;对于Java开发工程师这个职位的具体要求&#xff1a; 在以下北上广深这些一线大城市的面试招聘当中不难看出&#xff0c;凡是工资…

Docker的数据管理(持久化存储)

文章目录 一、概述二、数据卷三、数据卷容器四、端口映射五、容器互联&#xff08;使用centos镜像&#xff09;总结 一、概述 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&a…

机器学习(吴恩达第一课)

课程链接 文章目录 第一周1、机器学习定义2、监督学习(Supervised learning)1、回归(Regression)2、分类(Classification) 3、无监督学习(Unsupervised learning)4、线性回归模型5、代价函数6、梯度下降(Gradient descent)1、学习率2、用于线性回归的梯度下降 第二周(多维特征…