分治法(棋盘覆盖问题)

news2024/11/15 4:22:28

目录

前言

一、棋盘覆盖

二、图示解析

三、代码实现

四、具体分析

总结


前言

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

一、棋盘覆盖

(棋盘覆盖问题)在一个2^{k}*2^{k}个方格组成的棋盘上,存在一个特殊的方格,如图棋盘中的红色方格,方格不能被覆盖,要求用四种L型骨牌来覆盖除特殊方格外的整个棋盘,任意两个L型骨牌不能重叠。

二、图示解析

特殊方块左上子棋盘中:                             在右上子棋盘:

        

左下子棋盘中:                                          在右下子棋盘中:

               

三、代码实现

C++:

#include <iostream>   // 包含输入输出流库
using namespace std;  // 使用标准命名空间

#define MAX 1025   // 定义宏MAX为1025
int k;  // 棋盘都大小
int x, y;  // 特殊方格的位置
int board[MAX][MAX];  // 初始化一个大小为MAX*MAX的棋盘数组
int tile = 1;  // 初始瓷砖号为1

void ChessBoard(int tr, int tc, int dr, int dc, int size) {  // 定义一个棋盘分割函数,参数包括起始行列(tr, tc)、特殊方格位置(dr, dc)以及尺寸size
    if (size == 1) return;  // 当尺寸为1时,返回

    int t = tile++;  // 将瓷砖号赋值给t,并递增瓷砖号
    int s = size / 2;  // 棋盘分割尺寸取一半

    if (dr < tr + s && dc < tc + s) {  // 特殊方格在左上子棋盘中
        ChessBoard(tr, tc, dr, dc, s);
    } else {
        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 {
        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 {
        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 {
        board[tr + s][tc + s] = t;
        ChessBoard(tr + s, tc + s, tr + s, tc + s, s);  // 递归处理右下子棋盘
    }
}

int main() {
    k = 3;  // 设置棋盘大小为3
    x = 1, y = 2;  // 特殊方格的位置(x, y)
    int size = 1 << k;  // 计算棋盘总尺寸
    ChessBoard(0, 0, x, y, size);  // 调用棋盘分割函数处理特殊方格
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%4d", board[i][j]);  // 打印棋盘中的数字
        }
        printf("\n");  // 换行
    }
    return 0;  // 返回执行成功
}

四、具体分析

代码模块化分析:

if (dr < tr + s && dc < tc + s) {  // 特殊方格在左上子棋盘中
        ChessBoard(tr, tc, dr, dc, s);
    } else {
        board[tr + s - 1][tc + s - 1] = t;  // 记录特殊方格所在位置
        ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);  // 递归处理左上子棋盘
    }

1.首先检查特殊方块是否在左上子棋盘中:如果特殊方块的行坐标dr小于起始行坐标tr加上子棋盘尺寸的一半,且列坐标dc小于起始列坐标tc加上子棋盘尺寸的一半,则特殊方块在左上子棋盘中。在这种情况下,递归地调用ChessBoard函数来处理左上子棋盘;否则,将特殊方块放置在左上角子棋盘的中心位置,记录在board数组中,然后递归地处理左上子棋盘的情况。

代码模块化分析:

 if (dr < tr + s && dc >= tc + s) {  // 特殊方格在右上子棋盘中
        ChessBoard(tr, tc + s, dr, dc, s);
    } else {
        board[tr + s - 1][tc + s] = t;
        ChessBoard(tr, tc + s, tr + s - 1, tc + s, s);  // 递归处理右上子棋盘
    }

2.接着检查特殊方块是否在右上子棋盘中:如果特殊方块的行坐标dr小于起始行坐标tr加上子棋盘尺寸的一半,且列坐标dc大于等于起始列坐标tc加上子棋盘尺寸的一半,则特殊方块在右上子棋盘中。在这种情况下,递归地调用ChessBoard函数来处理右上子棋盘;否则,将特殊方块放置在右上角子棋盘的中心位置,记录在board数组中,然后递归地处理右上子棋盘的情况。

代码模块化分析:

if (dr >= tr + s && dc < tc + s) {  // 特殊方格在左下子棋盘中
        ChessBoard(tr + s, tc, dr, dc, s);
    } else {
        board[tr + s][tc + s - 1] = t;
        ChessBoard(tr + s, tc, tr + s, tc + s - 1, s);  // 递归处理左下子棋盘
    }

3.然后检查特殊方块是否在左下子棋盘中:如果特殊方块的行坐标dr大于等于起始行坐标tr加上子棋盘尺寸的一半,且列坐标dc小于起始列坐标tc加上子棋盘尺寸的一半,则特殊方块在左下子棋盘中。在这种情况下,递归地调用ChessBoard函数来处理左下子棋盘;否则,将特殊方块放置在左下角子棋盘的中心位置,记录在board数组中,然后递归地处理左下子棋盘的情况。

代码模块化分析:

if (dr >= tr + s && dc >= tc + s) {  // 特殊方格在右下子棋盘中
        ChessBoard(tr + s, tc + s, dr, dc, s);
    } else {
        board[tr + s][tc + s] = t;
        ChessBoard(tr + s, tc + s, tr + s, tc + s, s);  // 递归处理右下子棋盘
    }

4.最后检查特殊方块是否在右下子棋盘中:如果特殊方块的行坐标dr大于等于起始行坐标tr加上子棋盘尺寸的一半,且列坐标dc大于等于起始列坐标tc加上子棋盘尺寸的一半,则特殊方块在右下子棋盘中。在这种情况下,递归地调用ChessBoard函数来处理右下子棋盘;否则,将特殊方块放置在右下角子棋盘的中心位置,记录在board数组中,然后递归地处理右下子棋盘的情况。


总结

这个算法的好处是它采用了分治策略,将原问题划分为多个子问题进行处理,从而降低了问题规模,简化了问题的复杂度。通过逐步递归处理子棋盘,可以确保特殊方块被正确地放置在整个棋盘上,并且不会覆盖在同一子棋盘内。然而,这个算法的缺点是在处理每个子棋盘时需要进行四次递归调用,这可能会导致递归深度较深,耗费较多的计算资源。此外,递归算法在处理大规模数据时可能会存在栈溢出的风险,需要谨慎处理。

综合而言,这个算法适用于解决特定类型的问题,但需要考虑到递归深度和计算资源的消耗,以确保算法的效率和稳定性。初来乍到,写的不好,欢迎各路大神批评指正!!
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.8万字总结:金融核心系统数据库升级路径与场景实践

OceanBase CEO 杨冰 谈及数字化转型&#xff0c;如果说过去还只是头部金融机构带动效应下的“选择题”。那么现在&#xff0c;我相信数字化转型已经成为不论大、中、小型金融机构的“必答题”。 本文为OceanBase最新发布的《万字总结&#xff1a;金融核心系统数据库升级路径…

【ARM+Codesys案例】基于全志T3+Codesys的快递物流单件分离器控制系统

物流涉及国计民生&#xff0c;是在社会发展中不可或缺的一环。随着社会的改革开放&#xff0c;工业发展迅猛&#xff0c;此时也伴随着物流业的快速发展。电商、快递等行业业务量爆发以及人工成本的不断上涨&#xff0c;自动化输送分拣设备市场呈现井喷式发展。物流行业从传统方…

Linux——Docker容器虚拟化平台

安装docker 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 不需要设置防火墙 docker命令说明 docker images #查看所有本地主机的镜像 docker search 镜像名 #搜索镜像 docker pull 镜像名 [标签] #下载镜像&…

navicat连接过的库忘记密码

1、点击文件->导出连接 2、勾选想要知道密码的库 3、打开导出的文件搜索Password 4、复制Password解密 把下面的php代码复制到在线运行php的网站&#xff0c;替换最下面的decrypt(‘B7246A6E64D4F50A563FA20427A47991’)括号里的内容&#xff0c;然后执行php代码&#xff0…

Thinkphp5响应式进销存仓库管理系统

随着企业规模的不断扩大和市场竞争的日益激烈&#xff0c;进销存管理在企业的运营中扮演着越来越重要的角色。为了提高企业的运营效率&#xff0c;降低库存成本&#xff0c;提升客户满意度&#xff0c;越来越多的企业开始引入进销存仓库管理系统。 进销存仓库管理系统是一种集…

洛谷 CF1209D Cow and Snacks

题目来源于&#xff1a;洛谷 题目本质&#xff1a;并查集 解题思路&#xff1a; 我们以每种化为一个点&#xff0c;以每个客人喜欢的两朵花给两朵花连一条无向边。则会出现一定数目的连通块&#xff0c;连通块总个数为 ans。 对每个连通块进行分析&#xff1a;第一个客人买走…

大模型部署推理应用技术浅析

大模型完成预训练后不是就万事大吉了&#xff0c;离推理应用还有很大距离&#xff0c;需要经过微调、部署等一系列工程化工作。尤其是在2B的行业大模型应用中&#xff0c;为解决大模型的幻觉、时效性和推理成本问题&#xff0c;需要建立单一模型之上的体系。模型部署中的技术大…

基于物联网技术的智能家居实训教学解决方案

引言 随着信息技术的飞速发展&#xff0c;&#xff0c;物联网&#xff08;IoT&#xff09;已深入至我们生活的每一个角落&#xff0c;从智能家居、智能健康、智能交通到智慧城市&#xff0c;无所不在。物联网技术已成为推动社会进步和产业升级的重要力量。智能家居作为物联网技…

【最新更新】上市公司-全要素生产率(1999-2023年)(数据+5种方法测算)

上市公司的全要素生产率是指在一定时期内&#xff0c;上市公司通过使用各种生产要素(包括资本、劳动力、技术等)所创造的价值。它是衡量上市公司经营绩效的重要指标之一&#xff0c;可以反映出公司的生产效率和创新能力。全要素生产率的计算方法有很多种&#xff0c;其中最常见…

【堡垒机小知识】堡垒机和接口机的重要区别分析

在企业IT架构管理中&#xff0c;接口机和堡垒机各自扮演着不可或缺的角色。但不少IT小伙伴对于两者不是很了解&#xff0c;不知道两者之间有什么区别&#xff0c;今天我们就来一起分析一下。 堡垒机和接口机的重要区别分析 1、功能区别 接口机主要用于数据库层面的数据交换和…

大学运动康复试题及答案,分享几个实用搜题和学习工具 #其他#职场发展

大学生除了学习专业知识外&#xff0c;还应该关注和学习一些软技能&#xff0c;如沟通能力、团队合作和领导力等&#xff0c;以提升自己的综合素质。 1.滴墨书摘 这款软件相当于一个在线“摘抄本”&#xff0c;我们可以利用它来记录一些阅读时遇到的好句子或者是段落&#xf…

【Linux】使用 s3fs 挂载 MinIO 桶

s3fs&#xff08;S3 File System&#xff09;是一个基于FUSE&#xff08;Filesystem in Userspace&#xff09;的用户空间文件系统&#xff0c;可以将Amazon S3存储桶挂载到本地文件系统。通过s3fs&#xff0c;我们可以像操作本地文件一样&#xff0c;对S3存储桶中的数据进行读…

关于如何通过APlayer+MetingJS为自己的wordpress博客网页添加网易音乐播放器(无需插件)

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 序言&#xff1a;最近在网上冲浪&#xff0c;发现大家的博客大部分都有一个音乐播放器能够播放音乐&#xff0c;随机我也开始寻找解决方法。可是找来找去我…

磁盘问题——外部、动态,无法读取

今天&#xff0c;小编又遇到事了&#xff0c;给同事换个电脑&#xff0c;要把他原来的硬盘拆过去&#xff0c;一开始电脑都准备好了&#xff0c;就差拆他的硬盘了&#xff0c;结果装过去&#xff0c;问题来啦&#xff01;如下图所示&#xff1a; 这下可咋搞呢&#xff01;我先用…

[STM32+HAL]LD-1501MG舵机二次开发指南

一、准备材料 核心板&#xff1a;STM32F407ZGT6 舵机&#xff1a;LD-1501MG数字舵机 控制器&#xff1a;24路PWM舵机控制器 二、HAL库配置 开启串口与控制器通信 三、Keil填写代码 1、Servo.c #include "Servo.h" #include "usart.h"uint8_t Message…

SQLI-labs-第二十六关和第二十六a关

目录 第二十六关 1、判断注入点 2、判断数据库 3、判断表名 4、判断字段名 5、获取数据库的数据 第二十六a关 第二十六关 知识点&#xff1a;绕过and、or、空格、注释符等过滤 思路 通过源代码&#xff0c;我们可以知道&#xff0c;数据库对用户的输入进行了过滤&…

cobalt strike基础测试

下载链接4.3&#xff1a;https://pan.baidu.com/s/1E_0t30tFWRiE5aJ7F-ZDPg 链接4.0&#xff1a;https://pan.baidu.com/s/1SkMmDem3l6bePqIDgUz2mA 提取码&#xff1a;burp 一、简介&#xff1a; cobalt strike(简称CS)是一款团队作战渗透测试神器&#xff0c;分为客户端…

AI与空间设计的碰撞?

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答9 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

delphi advstringgrid 表格中加checkbox

加checkbox for i : 0 to sg.RowCount - 1 dobeginsg.AddCheckBox(1,i,false,false);for j : 0 to sg.ColCount - 1 dobeginif j <> 1 thensg.CellProperties[j,i].ReadOnly : true;//只读end;end; 读取&#xff0c;设置checkbox&#xff0c;全选&#xff0c;反选 proced…

【Spring Cloud】API网关

目录 什么是API网关为什么需要API网关前言问题列表 API网关解决了什么问题常见的网关解决方案NginxLuaSpring Cloud Netflix ZuulSpringCloud Zuul的IO模型弊端 Spring Cloud Gateway 第二代网关——GatewayGateway的特征Spring Cloud Gateway的处理流程Spring Cloud Gateway的…