五大常用算法(一) 分治算法(4) 棋盘覆盖

棋盘覆盖算法(分治法) 棋盘覆盖问题是指在一个 2k×2k 的棋盘上,缺失一个格子,要求用 L 形的三格骨牌覆盖整个棋盘,使得每个格子都被覆盖且没有重叠。以下是详细的算法实现,包括原理、步骤、图示法表示步骤、代码关键行注释和时间复杂度。棋盘覆盖算法通过分治法,将棋盘分成更小的子棋盘,并递归地处理每个子棋盘,最终覆盖整个棋盘。该算法的时间复杂度为指数级别,适用于中小规模的棋盘覆盖问题。假设我们有一个 4×4 的棋盘,缺失的格子位于 (2,2)。步骤 2:递归处理子棋盘。3. 图示法表示步骤。4. 代码关键行注释。 阅读详情

转载自:http://bingxinye1.blog.163.com/blog/static/1687970982010910103023578/

在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。

    四各L型骨牌如下图1
棋盘覆盖问题 - 蔷薇阁 - 落落工作室
 
      图1  
棋盘中的特殊方格如图2
棋盘覆盖问题 - 蔷薇阁 - 落落工作室
 
图2
    实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理如图3所示。
棋盘覆盖问题 - 蔷薇阁 - 落落工作室
图3
 
代码:
#include<iostream>
using namespace std;
const int Max=1000;
int board_size;
int board[Max][Max];
 
//row是大棋盘左上角的横坐标
//col是大棋盘左上角的竖坐标
//r,c分别为黑格子的横竖坐标
void chessboard(int row,int col,int r,int c,int size)
{
 if(size==1)
  return;
 static int board_number=1;
 int d;
 d=board_number++;
 int half_size=size/2;
 
 if(r<half_size+row&&c<half_size+col)//特殊方格在左上角子棋盘
 {
  chessboard(row,col,r,c,half_size);
 }
 else// 不在此棋盘,将此棋盘右下角设为相应的骨牌号
 {
  board[row+half_size-1][col+half_size-1]=d;  //
  chessboard(row,col,row+half_size-1,col+half_size-1,half_size);
 }
 if(r<row+half_size&&c>=col+half_size)////特殊方格在右上角子棋盘
 {
  chessboard(row,col+half_size,r,c,half_size);
 }
 else
 {
  board[row+half_size-1][col+half_size]=d;
  chessboard(row,col+half_size,row+half_size-1,col+half_size,half_size);
 }
 if(r>=row+half_size&&c<col+half_size)//特殊方格在左下角子棋盘
 {
  chessboard(row+half_size,col,r,c,half_size);
 }
 else
 {
  board[row+half_size][col+half_size-1]=d;
  chessboard(row+half_size,col,row+half_size,col+half_size-1,half_size);
 }
 if(r>=row+half_size&&c>=col+half_size)//特殊方格在右下角子棋盘
 {
  chessboard(row+half_size,col+half_size,r,c,half_size);
 }
 else
 {
  board[row+half_size][col+half_size]=d;
  chessboard(row+half_size,col+half_size,row+half_size,col+half_size,half_size);
 }
}
void print(int k)
{
 for(int i=0;i<k*2;i++)
 {
  for(int j=0;j<2*k;j++)
  {
   cout<<board[i][j]<<" ";
  }
  cout<<endl;
 }
}
int main()
{
 int k;
 cout<<"请输入棋盘的个数:"<<endl;
 cin>>k;
 int r,c;
 cout<<"请输入是黑色格子的位置:"<<endl;
 cin>>r>>c;
 board[r][c]=0;
 chessboard(0,0,r,c,k*2);
 print(k);
 return 0;
}
棋盘覆盖问题 棋盘覆盖问题是在一个2^k*2^k(k>=0)个方格组成的棋盘中,用L型骨牌覆盖覆盖棋盘上除特殊方格以外的所有方格,并且任何两个L型骨牌不可以重叠覆盖。L型骨牌可以有如下4种形态: 一个L型骨牌由3个方格组成,所以覆盖一个棋盘需要(2^k*2^k-1)/3个L型骨牌。 棋盘覆盖问题采用的的是分治法的思想:将1个大的棋盘分成4个小的棋盘,特殊方格一定在4个小棋盘中的某一个棋盘中,其余3个 阅读详情

相关推荐

五大常用算法(一) - 分治算法

分治算法 基本思想 分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题类型一致,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。 分治是很多高效算法的基础,如排序算法(快速排序,归并...

能能 2744

棋盘覆盖问题实现

棋盘覆盖问题是递归的分治思想的典型应用,本文档利用c/c++ 实现棋盘覆盖问题

棋盘覆盖问题(保姆级解释)

待输入

qq_25245727的博客 5081

C++棋盘覆盖问题 (算法设计分析)

基于C++的编程,有兴趣的朋友可以下载来看看!很好的哦~

L型骨牌(棋盘覆盖问题)---算法分析之分治策略

算法分析与设计 课程中分治策略的典型例子,采用MFC文档编程可视化实现算法; 能够手动进行对棋盘的颜色填充,并能显示棋盘中的填充数值。 由于这是课程作业,时间紧而赶制的,封装性可能比较差。 我用的版本是C++6.0的老版本,静态链接库,其中的exe可以直接运行。

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

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

Lerbronjames的博客 1385

算法设计第三章棋盘覆盖问题.pdf

算法设计第三章棋盘覆盖问题设计报告,以规模K=3,下标x,y分别为1,2,进行展开设计,当然K,x,y值可以取其它的数值,完整运行代码,在我的博客文章里面,这里是设计,只给出核心代码

五大算法思想(一)分治算法及常见例子

五大算法思想 分治算法介绍 二分搜索、大整数乘法、Strassen矩阵乘法、棋盘覆盖、合并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表、汉诺塔

HK的博客 1万+

分治算法 残缺棋盘解法

用分而治之方法可以很好地解决残缺棋盘问题。

2022年TI杯模拟电⼦系统设计专题邀请赛——李萨如图形演示装置

本次装置主要是对输入的正弦信号进行频率变换,并将原输入正弦信号作为 X 轴信号、变换后的正弦信号作为 Y 轴信号,绘制李萨如图形。采用 EK-TM4C123GXL 板卡作为主控;频率变换采用“锁向环+计数器”实现 1-5 倍频的频率变换控制;李萨如图形采用两个 AD通道采集原输入的正弦信号作为 X 轴信号和频率变换后的正弦信号作为 Y 轴信号,绘制李萨如图形。

qq_45890466的博客 7768

五大常用算法之一:分治算法

分治算法 一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关...

CSer 3万+

Unity游戏开发客户端面经——数据结构(初级)

Unity游戏开发客户端面经 之 数据结构篇

Sea3752的博客 1万+

五大常用算法——分治算法详解及经典例题

一、基本概念    在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……    任何一个可以用计算机求解的问题所需的计算时间都与其规模有...

qq_37763204的博客 3万+

Aruba CX交换机 初始化配置

Aruba CX 交换机 6000系列 8000系列交换机配置

Harry_Guo 1834

信息隐藏 数字图像空域隐写与分析技术的实现

【代码】信息隐藏 数字图像空域隐写与分析技术的实现。

Yungoal的博客 468

算法设计——五大算法总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 算法设计总结一、【分治法】二、【动态规划法】三、【贪心算法】四、【回溯法】1、回溯法的一般描述五、【分支限界法】 一、【分治法】 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)

yuanmartin的博客 1万+

DeepSeek赋能公文写作:从高效成文到精准传情的全维度指南

摘要:AI赋能公文写作的精准化实践 公文写作长期面临框架混乱、素材匮乏、表达不规范、修改低效等痛点。DeepSeek等AI工具通过"精准指令+分步赋能"模式实现突破:首先明确公文的目的性、逻辑性和规范性特征;其次采用包含场景、类型、目的等要素的指令模板;再分四步实施:框架搭建确保层次分明,内容填充解决素材问题,表达优化适配不同语体,合规校验把关格式规范。典型案例显示,AI能将数据罗列转化为"数据+成果+价值"的生动表述,使公文既规范又具感染力。这种AI赋能的写作方法显

通俗易懂学IT 231

五大常用算法:分治、动态规划、贪心、回溯、分支限界

文章目录五大常用算法之一:分治算法五大常用算法之二:动态规划算法贪心算法例子五大常用算法之四:回溯法五大常用算法之五:分支限界法一、基本描述(1)分支搜索算法(2)分支限界搜索算法区别应用实例-分枝界限法(Branch and Bound Method)1、基本思想算法设计中的时空转换概念实现求解完全整数规划问题和混合整数规划问题的分支定界法。 五大常用算法之一:分治算法 实际上就是类似于数学归纳法,找到解决本问题的求解方程公式,然后根据方程公式设计递归程序。 1、一定是先找到最小问题规模时的求解方法 2、

AbiUni(YY熊) 2626

YOLOv11半监督学习深度解析:基于FixMatch改进的先进目标检测框架

本文探讨了半监督学习与YOLOv11结合的创新方法。针对目标检测中半监督学习面临的伪标签质量不稳定、特征一致性难保证等挑战,研究提出改进版FixMatch框架。通过分析YOLOv11架构特性(如多尺度特征提取、双标签分配策略等)与半监督学习的适配性,设计了三项关键技术改进:空间感知阈值策略、多任务解耦处理和记忆增强机制。该方法在少量标注数据下可实现接近全监督的性能,显著降低工业检测等场景的数据标注成本。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 2084

华为OD机试 - 单词倒序(Python/JS/C/C++ 2025 A卷 100分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1226

【基础算法】(05)五大常用算法之一:分治算法

本系列介绍了五大常用算法,其中本文是第一篇,介绍了 **'分治算法'** 的细节内容。

西海 Tech 1218

康复训练监测系统:基于YOLOv8的患者动作规范识别

本文系统介绍了基于YOLOv8的康复训练动作规范识别系统,从理论背景、数据准备、模型训练、推理应用到UI界面,提供了完整技术链条及代码示范。希望对康复领域的智能监测应用提供参考和借鉴。

YOLO 453
上一篇: 五大常用算法(一) 分治算法(3) Strassen矩阵乘法
下一篇: 五大常用算法(一) 分治算法(5) 快速排序
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值