算法设计与分析实验指导2——棋盘覆盖问题

算法分析与设计:棋盘覆盖问题(分治法) 棋盘覆盖问题 在一个 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^{ 阅读详情

算法设计与分析实验指导2

2. 棋盘覆盖问题

这篇讲得很清楚

2.1 思路分析

利用分治的思想:

  • 当k=0时,结束递归;
  • 当k>1时,将2k * 2k的棋盘分成四个2k-1*2k-1的子棋盘,其中有一个子棋盘必然包含一个残缺的方块,另外三个是完整的,这时候在三个完整的子棋盘的边界放一个跨越边界的L型骨牌,作为残缺方块,这样所有四个子棋盘都有了残缺方块,相当于变成了四个规模减小的子问题。

2.2 代码

//棋盘覆盖问题
/*
(tr,tc)是棋盘左上角的方格坐标
(dr,dc)是特殊方格所在的坐标
size是棋盘的行数和列数
*/
#include<iostream>
using namespace std;
int board[100][100];
static int tile = 1;

void ChessBoard(int tr, int tc, int dr, int dc, int size)
{
	if (size == 1) return;//递归边界 

	int t = tile++;//L型骨牌号 
	int s = size / 2;//分割棋盘 
	//覆盖左上角子棋盘 
	if (dr < tr + s && dc < tc + s) ChessBoard(tr, tc, dr, dc, s);//特殊方格在此棋盘中 
	else { //此棋盘中无特殊方格,用t号L型骨牌覆盖右下角 
		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 { //此棋盘中无特殊方格,用t号L型骨牌覆盖左下角
		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 { //此棋盘中无特殊方格,用t号L型骨牌覆盖右上角
		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 { //此棋盘中无特殊方格,用t号L型骨牌覆盖左上角 
		board[tr + s][tc + s] = t;
		//覆盖其余方格 
		ChessBoard(tr + s, tc + s, tr + s, tc + s, s);
	}
}

int main()
{
	int i, j;
	int k;
	while (cin >> k)
	{
		int size = 1 << k;
		int x, y;
		cin >> x >> y;
		board[x][y] = 0;
		ChessBoard(0, 0, x, y, size);
		for (i = 0; i < size; i++)
		{
			for (j = 0; j < size; j++)
				cout << board[i][j] << "\t";
			cout << "\n";
		}
	}
	return 0;
}

2.3 测试数据

假设一个22*22的棋盘,在[2, 2]位置插入残缺子块(记为0号),测试结果如下:

在这里插入图片描述

算法设计与分析——棋盘覆盖问题 在一个2^k * 2^k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。该棋盘为特殊棋盘,蓝色的方格为特殊方格。棋盘覆盖问题是指,要用图2中的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。用分治法设计一个求解棋盘覆盖问题的算法,并且用c++语言实现。思路分析: 第一眼看到这个题目,我是蒙的,除了暴力 阅读详情

相关推荐

【算法】棋盘覆盖详解,基础教程~

简单讲解棋盘覆盖的基本原理,另附实现代码。

早知晓的博客 2万+

分治法实现棋盘覆盖C++

#include using namespace std; const int size = 8; static int tile = 1; static int board[size][size] = { 0 }; class CHESSBOARD { public: /* 分治法实现棋盘覆盖 */ static void chessBoard(int tr, int tc, int

J.Anson的博客 4155

经典算法之棋盘覆盖问题 --分治法

一:算法分析 棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中,你给定任意一个特殊点,用一种方案实现对除该特殊点的棋盘实现全覆盖。 建立模型如图: 解决方案就是利用分治法,将方形棋盘分成4部分,如果该特殊点在某一部分,我们就去递归他,如果不在某一部分,我们假设一个点为特殊点,同样递归下去,知道全覆盖。 左上角的子棋盘(若不存在特殊方格):则将该子棋盘右下角的那个方格假设为特殊方

FreeeLinux's blog 3万+

C++经典算法问题:棋盘覆盖问题(分治算法)!含源码示例

棋盘覆盖问题 问题说明 在一个2^k * 2^k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格。 棋盘覆盖问题就是要用图示的4种不同形态的L型骨牌覆盖给定棋盘上除特殊方格之外的所有方格,且任何2个L型骨牌不得重叠覆盖。 功能说明 本程序用分治法的思想解决了棋盘覆盖问题,显示输出 代码简述 用户输入数据,程序输入检测,动态分配空间,调用棋盘覆盖函数,把计算结果存储到board(二维数组指针),显示输出。 其中棋盘覆盖函数用分治的思想把棋盘分成四份,递归求解。 源..

致力于C语言C++知识分享! 3330

算法分析与设计之棋盘覆盖问题

问题描述:在一个2K*2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中我们要用4个不同形态的L行形骨牌覆盖一个特定的棋盘上除特殊方格以外的所有方格,并且任何2个L形骨牌不得重叠覆盖。问题分析:对于特殊方格在棋盘上的位置,显然有4K种不同情形,也就意味着有4k种不同的棋盘,在任何一个2k*2K的棋盘覆盖中,用到的L形骨牌个数恰为(

hello_tomorrow_111的博客 2380

c++ (分治法)棋盘覆盖问题实现 含有PPT 自己研究算法哟 可以运行

c++ (分治法)棋盘覆盖问题实现 含有PPT 自己研究算法哟 可以运行

棋盘覆盖问题图形界面分治法详解(C++)

用分治策略,当k>0时,将2^k*2^k棋盘分割成4个2^(k-1)*2^(k-1)子棋盘,如下图。 只要递归的使用这种分割,就可以将问题缩小到2*2的四缺三小问题啦。 我的编译环境是VS2019,用到了EasyX图形库,几百KB大小,可以去官网下一个,个人感觉挺好用。 输入: 4(k的值),50(每个方格的边长(像素单位)) 输出: 自己运行时由于加了Sleep()函数,所以会是一个动态的过程。数字代表递归的次数。颜色为RGB随机数,不想太多颜色可以把注释随机颜色的那行删掉.

qq_47932093的博客 2284

棋盘覆盖问题 分治法——C++代码

课程的随堂作业,C语言的,用dev就能运行,萌新代码,勿喷,仅仅帮助不想写作业的朋友方便一下,反正老师也不会仔细检查的

棋盘覆盖(C++|分治|递归)

题目描述 Description 棋盘覆盖问题:给定一个大小为2^n2^n个小方格的棋盘,其中有一个位置已经被填充,现在要用一个L型(22个小方格组成的大方格中去掉其中一个小方格)形状去覆盖剩下的小方格。求出覆盖方案,即哪些坐标下的小方格使用同一个L型格子覆盖。注意:坐标从0开始。左上方的第一个格子坐标为(0,0),第一行第二个坐标为(0,1),第二行第一个为(1,0),以此类推。 Input 输入第一行为测试用例个数,后面每一个用例有两行,第一行为n值和特殊的格子的坐标(用空格隔开),第

weixin_43442778的博客 1372

棋盘覆盖算法(分治算法)

一个c++代码。残缺棋盘(defective chessboard)是一个有2k×2k 个方格的棋盘,其中恰有一个方格残缺。图2 - 3给出k≤2时各种可能的残缺棋盘,其中残缺的方格用阴影表示。注重当k= 0时,仅存在一种可能的残缺棋盘(如图1 4 - 3 a所示)。事实上,对于任意k,恰好存在22k 种不同的残缺棋盘。

西南交通大学算法分析与设计实验报告 - 棋盘覆盖问题.docx

在一个2^k*2^k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。棋盘覆盖问题要求下图四种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任意2个L型骨牌不得重叠覆盖。 (仅供参考,请独立完成实验)

【计算机算法设计与分析】棋盘覆盖问题(C++_分治法)

若不在,则填充一个特殊方格,将其改变成一个更小的特殊棋盘(子问题),依次递归解决。按照这样来算,对于当前的整个棋盘的四部分来说,有特殊方格那部分不用覆盖,而其余三部分都新增了一个特殊方格,恰好凑成一个L型骨牌,递归直到当前棋盘只有一个方格为止。棋盘覆盖:用4种不同形态(方向不同)的L型骨牌覆盖一个给定的特殊棋盘(即特殊方格的位置已经确定了)上除特殊方格外的所有方格,且任何两个L型骨牌不得重复覆盖。个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一个特殊方格,且称该棋盘为一个特殊棋盘。

ccql's Blog 2394

用C++从零复刻Wordle:手把手教你实现命令行猜词游戏(含完整源码解析)

本文详细介绍了如何使用C++从零开始实现一个命令行版本的Wordle猜词游戏,包含完整的源码解析和核心模块设计。通过游戏逻辑控制器、单词库管理器等模块的构建,开发者可以学习C++实战技巧和性能优化方法,适合提升编程能力和游戏开发兴趣。

weixin_26763955的博客 334

算法分析与设计实验报告——实现分治法求解棋盘覆盖问题

算法分析与设计实验报告——实现分治法求解棋盘覆盖问题 目录:算法分析与设计实验报告——实现分治法求解棋盘覆盖问题一、 实验目的二、实验要求三、 实验原理四、 实验过程(步骤)五、 运行结果六、实验分析与讨论七、实验特色与心得附件一 实验过程(步骤)附件二 运行结果 一、 实验目的 掌握分治法的基本思想,建立算法复杂度的理论分析与实验分析的联系,深刻体会算法复杂度作为算法的好坏评价指标的本质含义。 二、实验要求 用c++语言实现棋盘覆盖问题,分析时间复杂性,体会分治法解决问题的基本思路和步骤。 三、 实验

千色千寻的博客 1万+

用python将dycom .dcm格式图像转换为nifti .nii

因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。

qq_41103479的博客 3609

告别玄学调参:手把手教你用20元件模型搞定GaN HEMT高频仿真(附S参数提取避坑指南)

本文详细介绍了如何使用20元件模型优化GaN HEMT高频仿真,解决传统16元件模型在10GHz以上频段的误差问题。通过S参数提取避坑指南和实战案例,帮助工程师精准建模分布式电极效应和寄生反馈路径,提升射频电路设计效率。

weixin_42523693的博客 441

棋盘覆盖问题——分治法——代码清晰易懂

一、运行环境 DevC++ 二、题目描述 棋盘覆盖问题。有一个2^k × 2^k个方格的棋盘,其中恰有一个方格残缺。用下面四种三格板覆盖更大的棋盘。 要求: ①两个三格板不能重叠。 ②三格板不能覆盖残缺方格,但必须覆盖其他所有的方格。 用以下形式进行结果输出 三、问题分析 采用分治的方法解决该问题。把2k×2k的棋盘分为4个2k-1×2k-1的子棋盘,使问题规模变小,直至将棋盘分割为1×1的子棋盘。 该问题属于二分法不相似的情况:分割后的4个子棋盘只有一个带有残缺。分治的技巧在于如何划分棋盘,使划分后的

qq_44886213的博客 7044

【数据分析八步法】将模糊需求转化为可验证的分析问题

国内访问Huggingface官方源常遇网络问题,可通过切换国内镜像提升下载速度。三种配置方式:1)设置HF_ENDPOINT环境变量;2)在from_pretrained中直接指定镜像参数;3)修改本地Huggingface配置文件。常用镜像包括hf-mirror.com、阿里云ModelScope和清华镜像源。注意镜像同步延迟、私有模型限制,建议配合huggingface-cli工具使用,必要时取消代理设置。合理配置镜像源可显著改善Huggingface生态使用体验。

Mr数据杨 858

【算法设计与分析】实验2:递归与分治—Hanoi塔、棋盘覆盖、最大子段和

在设计递归算法时,必须明确递归基准条件和递归表达式。递归基准条件是递归的终止条件,决定了递归何时停止,否则代码不会有输出结果。在Hanoi塔问题的设计中,我注意到了递归调用的顺序和参数的传递方式,确保递归能够正确进行。

m0_73970214的博客 1156

YOLOv8首创原创改进:即插即用|创新的轻量化非对称多级压缩LADH检测头

总结而言,本文介绍了一种名为轻量化非对称多级压缩LADH检测头的原创改进,该改进可与YOLOv8无缝适配,并显著提升了检测器的性能。在本文中,我们介绍了一种原创改进的检测头,名为轻量化非对称多级压缩LADH检测头,它可与YOLOv8无缝适配,显著提升了检测器的性能。此外,我们引入了多级压缩的概念,通过在不同的检测层级上应用不同程度的压缩,进一步提升了检测头的轻量化特性。具体而言,我们采用了逐级减少卷积核数量和通道数量的策略,以降低模型的参数量和计算复杂度,同时保持较高的检测精度。

IbcVue的博客 2181

项目报告:基于Sentaurus TCAD的多沟道长度NMOS器件仿真、SPICE模型提取与环形振荡器电路验证

本项目基于Sentaurus TCAD工具,完成了从器件仿真到电路验证的全流程研究。首先构建了45nm、65nm和90nm三种沟道长度的NMOS器件,通过TCAD仿真分析了其电学特性,观察到明显的短沟道效应。随后提取了BSIM4 SPICE模型参数,并生成Hspice可用的模型文件。最后利用该模型设计了11级环形振荡器进行电路验证,证明了模型的实用性。研究结果表明,随着沟道长度缩短,器件性能虽有所提升,但短沟道效应导致关态电流显著增加,影响整体能效。本项目为纳米尺度MOSFET的建模与电路设计提供了完整的技

huanghm88的专栏 284

棋盘覆盖问题——详解(C++)

【问题描述】 在一个 2 ^k × 2 ^k 个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k 种情形.因而对任何k≥0,有4^k种不同的特殊棋盘. 下图中的特殊棋盘是当k=3时64个特殊棋盘中的一个: 在棋盘覆盖问题中,要用下图中 4 中不同形态的** L 型骨牌覆盖一个给定的特殊棋牌上除特殊方...

weixin_44023658的博客 1万+

零基础速成simulink代码生成——stateflow基础3

此专栏面向嵌入式工程没有matlab开发经验的人,可以快速学习和实践这门技术。MDB技术,越来越成熟和普遍,从手写代码转到基于模型开发已经是大势,不仅减少开发周期,还增加代码的复用性。汽车领域、医疗和算法建模广泛使用。

不断debug,优化中…… 1711

【算法设计与分析】棋盘覆盖(递归分治经典问题)

本博客主要代码及思路来源:【算法设计与分析(第五版)】【王晓东】 1、题目背景介绍 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。 在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 易知,在任何一个2k×2k的棋...

○( ^皿^)っHiahiahia…的博客 2519

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

视觉人机器视觉的博客 2036

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

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

棋盘覆盖问题分治递归求解

棋盘覆盖问题描述 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 求解思路 当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。 特殊方格必位于4个较小子棋盘之一中,其余3个...

practical_sharp的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 算法设计与分析实验指导1——快速排序及第k小数
下一篇: 365天挑战LeetCode1000题——Day 013 每日一题
ShowM3TheCode
博客等级 码龄5年 29粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值