分治法:棋盘覆盖

分治法:棋盘覆盖问题 1、 分治法 摘自中科大算法导论课程资料 : 当求解的问题较复杂或规模较大时,不能立刻得到原问题的解,但这些问题本身具有这样的特点,它可以分解为若干个与原问题性质相类似的子问题,而这些子问题较简单可方便得到它们的解,因此通过合并这些子问题的解就可得到原问题的解。 2、思路: 1)将问题分解为规模更小的子问题; 2)解决这些子问题; 3)将已解决的子问题合并,求出原问题的解。 3、经典例子: 快... 阅读详情

分治法:棋盘覆盖

关于具体的实现过程就不累牍了 ,这里给出java的实现方法。
/**
	 * 核心算法 :递归调用实现棋盘覆盖
	 * @param stx 覆盖的矩阵的开始的横坐标
	 * @param sty 覆盖的矩阵的开始的纵坐标
	 * @param bx 开始时被覆盖的点的横坐标
	 * @param by 开始时被覆盖的点的纵坐标
	 * @param size 矩形的长度n(2的n次方的n的值)
	 */
	private void ChessBoard(int stx,int sty,int bx,int by,int size)
	{
			if(size==1)
				return;
			int s = size/2;
			if(bx<stx+s){
				if(by<sty+s){
					a[stx+s][sty+s-1]=a[stx+s-1][sty+s]=a[stx+s][sty+s]=marker++;
					ChessBoard(stx, sty,bx, by, s);//覆盖最上角
					
					ChessBoard(stx, sty+s,stx+s-1,sty+s, s);//覆盖右上角
		
					ChessBoard(stx+s, sty, stx+s, sty+s-1, s);//覆盖左下角
				
					ChessBoard(stx+s, sty+s, stx+s, sty+s, s);//覆盖右下角
				}
				else{
					
					a[stx+s-1][sty+s-1] = a[stx+s][sty+s-1] = a[stx+s][sty+s] = marker++;
					ChessBoard(stx, sty, stx+s-1, sty+s-1, s);//覆盖最上角
					ChessBoard(stx, sty+s,bx, by, s);//覆盖右上角
					ChessBoard(stx+s, sty, stx+s, sty+s-1, s);//覆盖左下角
					ChessBoard(stx+s, sty+s, stx+s, sty+s, s);//覆盖最下角
				}
			}else{
				if(by<sty+s){
					a[stx+s-1][sty+s-1]=a[stx+s-1][sty+s]=a[stx+s][sty+s]=marker++;
					ChessBoard(stx, sty,stx+s-1, sty+s-1, s);//覆盖最上角
					ChessBoard(stx, sty+s,stx+s-1,sty+s, s);//覆盖右上角
					ChessBoard(stx+s, sty,bx, by, s);//覆盖左下角
					ChessBoard(stx+s, sty+s, stx+s, sty+s, s);//覆盖最下角
				}
				else{
					a[stx+s-1][sty+s-1] = a[stx+s-1][sty+s] = a[stx+s][sty+s-1] = marker++;
					ChessBoard(stx, sty, stx+s-1, sty+s-1, s);//覆盖最上角
					ChessBoard(stx, sty+s,sty+s-1, sty+s, s);//覆盖右上角
					ChessBoard(stx+s, sty, stx+s, sty+s-1, s);//覆盖左下角
					ChessBoard(stx+s, sty+s,bx, by, s);//覆盖最下角
				}
			}
	}

最后我做了一个简单的android的demo用于显示棋盘覆盖:

通过输入大小(size )和开始时被覆盖的那个点就可以生成结果,使用图形显示,如下图:



源码我已经放在github上了 :

https://github.com/cassiePython/BoardCover

分治法实战:用棋盘覆盖算法解决残缺棋盘问题(附完整C++代码) 本文深入探讨了分治法在棋盘覆盖算法中的应用,通过详细的C++代码实现和调试技巧,帮助读者掌握这一经典算法。文章从问题本质出发,逐步讲解分治法的三步骤,并提供完整的代码示例和可视化调试方法,适合算法学习者和编程爱好者参考。 阅读详情

相关推荐

算法分析与设计:棋盘覆盖问题(分治法)

棋盘覆盖问题 在一个 2k×2k2^{k} \times 2^{k}2k×2k 个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格。显然,特殊方格在棋盘上出现的位置有 4k4^{k}4k 种情形。下图是 k=2k=2k=2 时 16 个特殊棋盘中的一个。 在棋盘覆盖问题中,要用图示的 4 种不同形态的 LLL 型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何 2 个 L\mathrm{L}L 型骨牌不得重叠覆盖。易知,在任何一个 2k×2k2^{k} \times 2^{

SongXJ的博客 3万+

分治法实验报告——以棋盘覆盖和快速排序为例

分治法 1 实验目的 通过练习掌握分治法的基本思想 2 实验要求 掌握棋盘覆盖程序,输入为2n*2n的棋盘,包含一个特殊方块。 随着n的增长,n从3增长到10,分别打印出棋盘覆盖程序所需的时间。 掌握快速排序算法。 分析快速排序算法的时间复杂度,比较算法与其他排序算法(冒泡)的时间复杂度。 3 实验内容 设计棋盘覆盖算法程序 分别求出不同规模的输入算法所需的运行时间,总结出该时间与n的关系。 分析棋盘覆盖程序实际复杂度与理论复杂度的差异。 设计快速排序算法程序。 用少量数据(10个数据)调试并测试算法

weixin_44249746的博客 3698

分治法实战:用C++手把手教你解决棋盘覆盖问题(附动态图解)

本文通过动态图解和代码分析,手把手教你使用C++和分治法解决经典的棋盘覆盖问题。文章详细阐述了分治思想如何应用于该问题,包括核心递归逻辑、数据结构设计、完整C++实现以及常见调试技巧,帮助你深入理解算法原理并掌握实战编码。

weixin_29266679的博客 404

棋盘覆盖问题

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

lzkIT的专栏 1304

分治法实战:棋盘覆盖算法的递归之美

本文深入探讨了棋盘覆盖算法的递归实现与分治法思想,通过详细的代码示例和可视化演示,展示了如何利用分治法解决复杂问题。文章还分析了算法的时间复杂度,并提供了工程实践中的优化建议和注意事项,帮助读者更好地理解和应用这一经典算法。

weixin_42528191的博客 428

棋盘覆盖问题:分治法解决方案

棋盘覆盖问题是一个经典的计算几何问题,其目标是在一个大小为2^k × 2^k的棋盘上,使用L形骨牌覆盖特定位置,使得所有位置都被覆盖且每个骨牌不重叠。对于棋盘覆盖问题,我们可以将大棋盘分割成4个相等大小的子棋盘,然后递归地对子棋盘进行覆盖,直到棋盘大小为1×1。否则,我们将当前子棋盘分割成4个相等大小的子棋盘,并根据特殊方格的位置确定其所在的象限。在每一次递归调用时,我们首先检查是否达到递归的终止条件,即棋盘大小为1×1。在上述代码中,我们首先定义了棋盘的大小为8×8,并初始化一个全0的棋盘。

IELLQUI8的博客 231

棋盘覆盖算法

棋盘算法

m0_73950754的博客 962

python实现棋盘覆盖动态可视化,完整代码可运行

完整代码可运行,有用户登录界面,登陆界面是可进行注册账号的登录界面,然后成功登录后可通过输入棋盘大小和特殊棋盘的位置点击create按钮,弹出新的窗口动态展示棋盘覆盖的过程

【算法】分治法之棋盘覆盖

文章目录前言算法实现思想代码实现时间复杂度 前言 有关分治算法思想文章指路:【算法】分治算法 什么是棋盘覆盖问题? (1)在一个2k×2k2^k×2^k2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。 (2)在棋盘覆盖问题中,要用以下4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 (3)例如: 我们需要用上面4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨

高朗的博客 8643

想学嵌入式但没开发板?试试这个免费的STM32虚拟仿真平台(含LVGL界面教程)

本文介绍如何利用免费的STM32虚拟仿真平台学习嵌入式开发,特别适合预算有限或零硬件基础的学习者。通过详细的LVGL界面开发教程,展示虚拟仿真在嵌入式学习中的高效性和实用性,涵盖环境搭建、代码实现到实机迁移的全流程,助力快速掌握嵌入式开发核心技能。

weixin_29266647的博客 306

MacBook 本地化部署 Dify 指南

dify 怎么安装部署 有哪些坑 !

weixin_44542598的博客 1522

浅谈棋盘覆盖问题(算法思想及伪代码)

问题描述:在一个的方格组成的棋盘中,有一个方格与其他的方格不同,称之为奇异块。要求:若使用一下四种L型骨牌覆盖除这个奇异块的其他方格,覆盖过程中L型骨牌之间不能有互相覆盖,设计算法求出覆盖方案。(四种L型骨牌如下图) 算法思想:分治法。 分治法原理:1.划分2.求解3.合并。将原始问题分解为如果个互不相同的子问题,对子问题进行求解。 (1)解题思路: 1.当k>0时,可以将棋盘由中心划分为对称的四份小棋盘(子问题划分)此时,我们很容易知道奇异块一定在其中一个子棋盘中,其他三个相邻的子棋盘没..

m0_56603583的博客 4948

ROS开发者的福音:用Anaconda虚拟环境解决Python包冲突(附完整配置流程)

本文为ROS开发者提供了使用Anaconda虚拟环境解决Python包冲突的完整方案。通过分析冲突根源,详细介绍了Miniconda安装、专用环境创建以及核心桥梁包的配置流程,并阐述了“混合环境运行”与“纯虚拟环境构建”两种实战工作流,帮助开发者实现ROS核心与特定Python库的和谐共存,从而提升开发效率和项目可维护性。

weixin_28835789的博客 338

Java 实现棋盘覆盖问题:分治法的巧妙应用

通过使用分治法,我们成功地解决了棋盘覆盖问题。这种方法不仅思路清晰,而且代码实现也相对简洁。分治法在很多算法问题中都有广泛的应用,通过对棋盘覆盖问题的学习和实践,我们可以更好地理解和掌握分治法的思想和应用技巧。希望本文能对大家在算法学习和实践中有所帮助,欢迎大家交流讨论。

2302_80667735的博客 1510

STMCubeMX使用TB6612驱动编码轮并进行测速

TB6612电机驱动模块通过IN1和IN2引脚控制电机的旋转方向,并通过PWM信号的占空比调节电机速度。代码示例展示了如何使用GPIO控制电机的正反转,以及如何动态调整PWM占空比实现速度控制。系统设计中,TB6612与编码减速电机连接,STM32CubeMX用于初始化GPIO和PWM输出。编码器接口配置使用TIM3进行测速,TIM4定时器用于速度计算。Keil软件中编写的代码包括编码轮计数值获取、速度计算、电机正反转控制以及小车运动控制等功能。通过OLED显示速度,并实现电机的调试与测试。

wwivn的博客 2260

避坑指南:从聚宽迁移到QMT必须知道的5个细节(含Redis连接异常处理)

本文详细解析了从聚宽迁移到QMT平台时需注意的5个关键细节,特别是Redis连接池优化和xtquant重连机制。通过实战代码示例,帮助量化团队解决信号传递稳定性、时间同步、滑点控制等核心问题,确保交易策略平稳过渡。

weixin_27303545的博客 427

分治法实战:用Python可视化棋盘覆盖问题(附完整代码)

本文通过Python实战,详细解析了棋盘覆盖问题的分治法解决方案,并提供了完整的代码实现与可视化教程。文章深入剖析了分治法的递归思想,通过matplotlib动画直观展示了棋盘被L型骨牌逐步覆盖的过程,帮助读者从原理到实践彻底掌握这一经典算法。

m9n0o的博客 681

从.bib到.bbl:手把手教你搞定LaTeX参考文献的完整流程

本文详细介绍了从.bib到.bbl的LaTeX参考文献处理完整流程,包括文献数据库构建、样式选择、主文档配置、编译流程及问题排查。特别针对.bib、.bbl等文件的操作提供了实战解决方案,帮助用户高效管理学术文献引用,适用于各类学术写作场景。

weixin_29292431的博客 285

棋盘覆盖的视觉化拆解:如何用分治法玩转L型骨牌拼图?

本文通过视觉化拆解的方式,深入浅出地讲解了如何运用分治法解决经典的棋盘覆盖问题。文章详细阐述了将2^k×2^k棋盘递归分割,并通过在中心放置L型骨牌来创造特殊格的核心原理,使每个子问题结构相同,最终实现用L型骨牌完美覆盖棋盘。

i1j2k的博客 116

TTL电路搭建半加器实验:操作指南完整版

通过TTL电路搭建半加器,详解逻辑设计与实验步骤,帮助掌握数字电路中的半加器工作原理与实际应用,适合电子技术初学者动手实践。

weixin_42524864的博客 355

华为OD新系统机试真题 - 准备生日礼物(Py/Java/C/C++/Js/Go)

华为OD机试新系统真题 4.8【准备生日礼物】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【准备生日礼物】

qq_45776114的博客 1478

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

学习目标: 使用分治法解决快速排序问题 使用分治法解决棋盘覆盖问题 学习内容: 学习时间: 学习产出:

看,好自为之的博客!!! 1080

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

分治法实战:棋盘覆盖问题的递归策略与L型骨牌构造

本文深入探讨了棋盘覆盖问题的分治法解决方案,详细解析了递归策略与L型骨牌构造的实现原理。通过代码示例和优化技巧,帮助读者掌握如何利用分治法高效解决复杂问题,特别适合算法学习者和编程爱好者参考实践。

weixin_33728268的博客 618

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

洛谷 U91193:棋盘覆盖问题 ← 分治法

洛谷 U91193 棋盘覆盖: 在一个2^k * 2^k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格。现在用4种不同形状的 L型(占3小格)骨牌覆盖棋盘上除了特殊方格以外的所有方格,且各骨牌不能重叠。 步骤为:将棋盘一分为四,依次处理左上角,右上角,左下角,右下角,递归进行。严格按照这个顺序处理。

hnjzsyjyj的专栏 1514

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法07:棋盘覆盖——分治法Part3

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

且行且歌且珍惜 1193
上一篇: 最小生成树 Prim算法实现
下一篇: OpenGL的安装与配置
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值