算法设计与分析——递归与分治策略——棋盘覆盖

分治法(棋盘覆盖问题) 有一个 2^kx2^k (k>0)的棋盘,恰好有一个方格与其他方格不同,称之为特殊方格。现在要用L形骨牌覆盖除了特殊方格以外的其他全部方格,骨牌可以任意旋转,并且任何两个骨牌不能重复。请给出一种覆盖方式 阅读详情

问题描述
棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中,你给定任意一个特殊点,用一种方案实现对除该特殊点的棋盘实现全覆盖。

建立模型如图:

解决方案就是利用分治法,将方形棋盘分成4部分,如果该特殊点在某一部分,我们就去递归他,如果不在某一部分,我们假设一个点为特殊点,同样递归下去,知道全覆盖。

左上角的子棋盘(若不存在特殊方格):则将该子棋盘右下角的那个方格假设为特殊方格;

右上角的子棋盘(若不存在特殊方格):则将该子棋盘左下角的那个方格假设为特殊方格;

左下角的子棋盘(若不存在特殊方格):则将该子棋盘右上角的那个方格假设为特殊方格;

右下角的子棋盘(若不存在特殊方格):则将该子棋盘左上角的那个方格假设为特殊方格;

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

在这里插入图片描述

实现的基本原理是将2^k * 2k的棋盘分成四块2(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理如图所示:

在这里插入图片描述

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int tile = 1;
int Borad[100][100];
/**
 * tr : 棋盘左上角的行号,tc棋盘左上角的列号
 * dr : 特殊方格左上角的行号,dc特殊方格左上角的列号
 * size :size = 2^k 棋盘规格为2^k*2^k
 */
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
    if(size==1)
        return;
    int t = tile++;
    int s = size / 2;
    if( dr< tr+s && dc< tc+s )//特殊方格在棋盘的左上角
    {
        ChessBoard(tr, tc, dr, dc, s);
    }
    else//特殊方格不在棋盘的左上角时;
    {
        Borad[tr + s-1][tc + s-1] = t;
        ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);

    }

    if( dr< tr+s && tc+s <=dc )//特殊方格在棋盘的右上角
    {
        ChessBoard(tr, tc + s, dr, dc, s);
    }
    else//特殊方格不在棋盘的右上角
    {
        Borad[tr + s-1][tc + s]=t;
        ChessBoard(tr, tc + s, tr + s-1, tc + s , s);
    }
    
    if( tr+s<= dr && dc < tc+s )//特殊方格在棋盘的左下角
    {
        ChessBoard(tr + s, tc, dr, dc, s);
    }
    else//特殊方格不在棋盘的左下角
    {
        Borad[tr+s][tc+s-1]=t;
        ChessBoard(tr + s, tc, tr+s, tc+s-1, s);
    }

    if( tr+s <= dr && tc+s <= dc )//特殊方格在棋盘的右下角
    {
        ChessBoard(tr + s, tc + s, dr, dc, s);
    }
    else//特殊方格不在棋盘的右下角
    {
        Borad[tr + s][tc + s]=t;
        ChessBoard(tr + s, tc + s, tr+s, tc+s, s);
    }






}
int main()
{
    cout << "输入K的值:";
    int k;
    cin >> k;
    int temp = 1;
    for (int i = 0; i < k;i++)
    {
        temp = temp * 2;
    }
    int size = temp;
    int x, y;//存储特殊点所在的行列
    cout << "输入特殊点在的行,列:(表示特殊点的值为-1):";
    cin >> x >> y;
    Borad[x][y] = -1;
    ChessBoard(0, 0, x, y, size);
    for (int i = 0; i < size;i++)
    {
        for (int j = 0; j < size;j++)
        {
            cout <<setw(4)<< Borad[i][j]<<" ";
        }
        cout << endl;
    }
        system("pause");

}

上述算法中:
使用了一个二维数组Board[][]表示棋盘,Board[0][0]是棋盘左上角的方格,tile是算法中的一个全局变量,用来表示L型骨牌,其初始值为0。
tr:棋盘左上角方格的行号
tc:棋盘左上角方格的列号
dr:特殊方格的行号
dc:特殊方格的列号
size:size=2^k,
棋盘的规格=2^K* 2^K
在这里插入图片描述
在这里插入图片描述

标记的次序:
在这里插入图片描述

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

相关推荐

《算法设计与分析》递归与分治策略——棋盘覆盖问题的递归调用过程

将8×8棋盘覆盖问题的递归过程详细手动执行。

lvxingjun的专栏 177

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

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

千色千寻的博客 1万+

算法设计与分析 递归与分治策略.docx

算法设计与分析实验报告:递归与分治策略,用python写的,附源码。主要处理问题如下: 1.ackerman函数实现; 2.大数划分; 3. 数据集合{1,2,3,4,5,6,7,8,9,10}的排列组合;

算法设计与分析——递归分治策略实现棋盘覆盖

C语言递归分治实现棋盘覆盖

m0_58197804的博客 285

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

算法设计与分析 用分治法求解棋盘覆盖 c语言源码+分析

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

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

【棋盘覆盖问题】“递归与分治策略”——《算法设计与分析(第五版)》

【棋盘覆盖问题】“递归与分治策略”——《算法设计与分析(第五版)》

NI‘CE’XIAN‘s blog 609

LlamaIndex 入门实战

LlamaIndex是一个“数据框架”,用于帮助构建LLM应用程序。它提供了各种工具,包括数据连接器,用于摄取现有数据源和数据格式(API,PDF,文档,SQL等),以及用于将数据结构化(索引,图形)以便与LLM轻松使用的方式。此外,LlamaIndex还提供了高级的检索/查询接口,可以输入任何LLM输入提示,并返回检索到的上下文和增强知识的输出。它还允许与外部应用程序框架(如LangChain,Flask,Docker,ChatGPT等)轻松集成。

AIGC搞起 1万+

算法系列(一):分治策略--棋盘覆盖

算法系列(一):棋盘覆盖 一、分析 问题描述:   图1-1 k=2时的一个特殊棋盘 在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其它方格不同,则称该方格为一特殊方格,且称该棋盘为一特殊棋盘。显然特殊方格在棋盘上出现的位置有 4^k 种情形。因而对任何 k>=0 ,有 4^k 种不同的特殊棋盘。图1-1中的特殊棋盘为 k=2 时 16 个特殊棋盘中的一个。

Sherly. 1万+

Cadence IC5141保姆级教程:Bandgap电路四大仿真(稳定性/噪声/启动/PSRR)完整流程与调参心得

本文提供Cadence IC5141中Bandgap电路的四大仿真(稳定性仿真、噪声仿真、启动仿真、PSRR仿真)的完整流程与调参心得。从原理图检查到ADE L配置,详细解析各仿真步骤的关键参数设置与优化策略,帮助工程师高效完成电路设计与性能调优。

weixin_30399821的博客 1650

cartographer错误终结者 ordered_multi_queue.cc:155 Queue waiting for data

错误描述 错误提示的感应器数据可能是: Queue waiting for data:(0, points2) Queue waiting for data:(0, odom) 说明在提供给cartographter的传感器数据出现了问题,没有被成功解析。 原因分析 小编是使用自己编写的odom话题发布时,cartographer爆出了该错误。 于是设想传感器数据相关的tf或lua配置或数据本身存在错误。 于是逐个排查,最终发现了错误原因。 排查可能原因:tf错误 小编之前已处理过tf与lua配置的问题 参

人工智能机器人 4157

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

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

m0_73970214的博客 1156

高通410刷OpenWRT后网络共享配置全攻略

本文详细解析了在高通410设备刷入OpenWRT后,因基带文件丢失导致无法上网的常见问题。核心解决方案是通过SMB网络共享,将备份的原厂基带文件传输至OpenWRT系统并正确还原,从而恢复移动网络连接。文章提供了从备份基带、刷机到配置共享和文件替换的完整操作指南。

grafana6viz的博客 571

算法设计与分析实验报告-递归与分治策略

分治策略是对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。分治法在每一层递归上都有三个步骤:分解,将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;解决,若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;合并,将各个子问题的解合并为原问题的解。2.求解8*8的棋盘覆盖。棋盘的特殊方格打印为“*”,普通方格打印为“.”。

m0_51657509的博客 1033

别再乱删文件了!修复Print Spooler服务自动停止的3个关键检查点(附Win10/Win11实测)

本文深入解析Windows系统中Print Spooler服务自动停止的常见原因及修复方法。从第三方驱动冲突、权限与服务依赖关系到打印队列积压,提供3个关键检查点的详细排查步骤,帮助用户彻底解决打印服务异常问题,适用于Win10/Win11系统。

weixin_31569671的博客 672

SAP CO模块实战:成本中心会计分割结构配置全流程(OKES事务码详解)

本文详细解析了SAP CO模块中成本中心会计分割结构的配置全流程,重点讲解了OKES事务码的实战操作。内容涵盖分割结构的概念理解、配置前的次级成本要素与作业类型主数据准备,并通过步骤拆解演示了如何定义分割结构、规则与版本,以及如何将配置关联到成本中心并执行分割。最后提供了常见问题排查与优化建议,旨在帮助顾问及财务人员掌握成本精确分摊的关键配置,确保期末成本核算的准确性。

embedding5hiker的博客 804

分治算法

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

An Insecure Programming 613

EtherCAT主站SOEM -- 19 --Qt-Soem通过CSP模式(周期同步位置模式)控制一个电机转圈圈

以上就是EtherCAT主站SOEM – 19 --Qt-Soem通过CSP模式(周期同步位置模式)控制一个电机转圈圈的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 1996

C++递归与分治算法原理示例详解

② 对 n - 1 个数进行同样的递归操作,当交换的第一个数的下标 k 和 序列末尾的 m 相同时,说明前置所有数都已经交换完成,进行输出。① 从 n 个数中取出数列的第一个数,然后不断将数列中剩余的数与第一个数进行交换,计算剩余 n-1 个数的全排列。,rn}是要进行排列的n个元素,求R的全排列Perm(R)。递归算法,分为 3 步:将 n 个 a 上的盘子借助 c 移动到 b。① 将 n-1 个 a 上的盘子借助 b 移动到 c。③ 将 c 上的 n-1 个盘子借助 a 移动到 b。

raoxiaoz0425的博客 137

lammps教程:实例讲解npt、nvt系综的选择

对于lammps新手来说,系综的选择令人困惑,到底是应该用nvt系综还是npt系综? 我在初学lammps时就被这个问题困扰了很久。如果去问别人,可能会告诉你一个答案:根据模拟需要确定。 其实和没说一样。 到底如何确定系综,确实不是一句两句能够说清楚的,不同的体系、不同的模拟目的要选择不同的系综。 前几天遇到的一个合金的模拟案例,比较有代表性,分享出来供大家参考。 建模方法和之前介绍过的高熵合金建模方法类似,先建立单晶模型,然后使用替换原子的命令获得合金结构。 建模完成后,按照常规,先上nvt系综进行驰豫

lammps_jiayou的博客 9767

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

2.递归分治策略

程序之间或者间接调用自身的程序1.斐波那契数列。

2301_81873056的博客 265

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

中国矿业大学计科算法导论菜鸟笔记

中国矿业大学计科算法导论笔记

weixin_53711294的博客 1242

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

分治策略之棋盘覆盖问题

引出 主角登场 解法 代码 总结 1:引出 首先用合并排序来引出我们今天的主角,合并排序即使用了分治的策略,它将所要排序的区间划分为2个子区间,将这两个子区间分别进行递归排好顺序,然后合并这两个子区间(合并过程运用了简单的双指针算法)即获得原问题的解。其实棋盘覆盖问题也是这样的。 2:主角登场 问题:在一个2k*2k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格。在棋盘覆盖问...

qq_45444041的博客 639

递归与分治之棋盘覆盖问题

在一个2^k * 2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘。 显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘。 下图所示的特殊棋盘为 k=2 时 16 个特殊棋盘中的一个。                                 在棋盘覆盖问题中,要用

八行书 592

棋盘覆盖问题

问题描述 1、在一个2^k^×2^k^个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为特殊棋盘。 如下为一个k=2的棋盘,其有2^k^×2^k^=4×4=16个不同的特殊棋盘 2、要使用图示所示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖 例如,很容易得出在2k×2k个方格组成的特殊棋盘中,需要用(2k×...

小菜鸡 1141

算法设计与分析复习总结(二)

本文主要介绍了递归与分治策略。

m0_74337962的博客 1087
上一篇: 篮子里拿鸡蛋问题
下一篇: 算法设计与分析——递归与分治——归并排序
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值