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

文章目录

    • 题目描述
    • 测试样例
    • 算法原理
    • 算法实现
    • 参考资料

题目描述

在一个 2 k × 2 k 2^k \times 2^k 2k×2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一个特殊方格,且称该棋盘为一个特殊棋盘。显然,特殊方格在棋盘上出现的位置有 4 k 4^k 4k 种情况,即k>=0,有 4 k 4^k 4k种不同的特殊棋盘。
棋盘覆盖:用4种不同形态(方向不同)的L型骨牌覆盖一个给定的特殊棋盘(即特殊方格的位置已经确定了)上除特殊方格外的所有方格,且任何两个L型骨牌不得重复覆盖。
在这里插入图片描述
问题要求输入棋盘的边长n,以及特殊方格的坐标。输出覆盖后的棋盘。

测试样例

输入:

4
1 0

输出:

3 3 4 4
1 3 2 4
6 2 2 5
6 6 5 5

算法原理

通常用分治法解决一维问题时,我们将一维数轴划分为数段,解决二维问题时就需要把二维空间均匀分成四块,对每一块继续递归。

对于这个问题,我们将棋盘划分为左上、右上、左下、右下四部分,对于每一部分判断特殊方格是否在其中。若特殊方格在这部分棋盘中,就直接将其继续作为一个子问题递归解决;若不在,则填充一个特殊方格,将其改变成一个更小的特殊棋盘(子问题),依次递归解决。按照这样来算,对于当前的整个棋盘的四部分来说,有特殊方格那部分不用覆盖,而其余三部分都新增了一个特殊方格,恰好凑成一个L型骨牌,递归直到当前棋盘只有一个方格为止。如下所示:
在这里插入图片描述

算法实现

#include <bits/stdc++.h>
using namespace std;
static int n, g[100][100], num = 1;void chessBoard(int x, int y, int sx, int sy, int size) {if (size == 1)return;int s = size / 2, t = num++;if (sx < x + s && sy < y + s)  chessBoard(x, y, sx, sy, s);//特殊方格在左上角else {//特殊方格不在左上角g[x + s - 1][y + s-1] = t;//左上角棋盘的右下角chessBoard(x, y, x + s - 1, y + s - 1, s);}if (sx < x + s && sy >= y + s)  chessBoard(x, y + s, sx, sy, s);//特殊方格在右上角else {  //特殊方格不在右上角g[x + s - 1][y + s] = t;//右上角棋盘的左下角chessBoard(x, y + s, x + s - 1, y + s, s);}if (sx >= x + s && sy >= y + s)  chessBoard(x + s, y + s, sx, sy, s);//特殊方格在右下角else {  //特殊方格不在右下角g[x + s][y + s] = t;//右下角棋盘的左上角chessBoard(x + s, y + s, x + s, y + s, s);}if (sx >= x + s && sy < y + s)  chessBoard(x + s, y, sx, sy, s);//特殊方格在左下角else {  //特殊方格不在左下角g[x + s][y + s-1] = t;//左下角棋盘的右上角chessBoard(x + s, y, x + s, y + s-1, s);}
}void main() {int x, y;//特殊方格坐标cin >> n;cin >> x >> y;g[x][y] = num;chessBoard(0, 0, x, y, n);for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++)cout << g[i][j] << "\t";cout << endl;}
}

参考资料

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

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

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

相关文章

mysql之CRUD和常见函数和UNION 和 UNION ALL

mysql之CRUD和常见函数和UNION 和 UNION ALL 一.CRUD1.创建&#xff08;Create&#xff09; - 插入数据2.读取&#xff08;Read&#xff09; - 查询数据3.更新&#xff08;Update&#xff09; - 修改数据4.删除&#xff08;Delete&#xff09; - 删除数据 二.函数1.字符串函数&…

并发程序设计--D4GDB调试多进程程序

使用GDB调试此程序 start后 10行进入father进程&#xff0c;接下来会一直在父进程不断执行程序 那么如何进入子进程&#xff1f; 此时杀死此程序进程 重新gdb调试&#xff0c;使用以下命令&#xff0c;再使用n&#xff0c;可进入子进程 那么如何同时调试父进程和子进程 上图可…

年终护眼台灯哪个好用?适合学生备考的台灯推荐

最近临近寒假&#xff0c;就有好多家长们和高校学子们催我推荐护眼台灯&#xff0c;人眼对光是非常敏感的&#xff0c;特别是儿童青少年眼睛还在发育的状态来说&#xff0c;光线是至关重要的&#xff0c;于是这次选择的护眼台灯我都是经过亲自使用测试的。 但由于现在护眼台灯…

【kettle】pdi/data-integration 打开ktr文件报错“Unable to load step info from XML“

一、报错内容&#xff1a; Unable to load step info from XML step nodeorg.pentaho.di.core.exception.KettleXMLException: Unable to load step info from XMLat org.pentaho.commons.launcher.Launcher.main (Launcher.java:92)at java.lang.reflect.Method.invoke (Met…

FA2016AA (MHz范围晶体单元超小型低轮廓贴片) 汽车

随着科技的不断发展&#xff0c;智能汽车逐渐成为人们出行的首选。而其中&#xff0c;频率范围在19.2 MHz ~ 54 MHz的晶体单元超小型低轮廓贴片&#xff08;FA2016AA&#xff09;为汽车打造更智能、更舒适、更安全的出行体验。FA2016AA贴片的外形尺寸为2.0 1.6 0.5 mm&#x…

新手深入浅出理解PyTorch归一化层全解析

目录 torch.nn子模块normal层详解 nn.BatchNorm1d BatchNorm1d 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.BatchNorm2d BatchNorm2d 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.BatchNorm3d BatchNorm3d 函数简介 参…

防浪涌TVS:电子设备的保护盾?|深圳比创达电子

在电子设备日益普及的今天&#xff0c;我们经常会听到设备因电压波动或突发浪涌而损坏的情况。那么&#xff0c;有没有一种方式可以保护我们的设备免受这些意外伤害&#xff1f;答案就是“防浪涌TVS(Transient Voltage Suppressor)”。但它是什么&#xff1f;它如何工作&#x…

华为欧拉安装部署:Oracle11g

一、环境准备 1、下载安装低版本的libaio包&#xff1b;libaio版本太高&#xff0c;会造成编译错误 查看libaio1库版本不能大于0.3.109 [oracles3 install]$ rpm -qa libaio libaio-0.3.110-12.el8.x86_64# 查看欧拉操作系统版本 [oraclelocalhost bin]$ cat /etc/os-release…

mcu与上位机通讯数据传输测速

问题 如何测量mcu与上位机通讯数据传输速度&#xff1f;&#xff08;串口、USB&#xff09; 解决 可以借助Bus Hound 将显示时间戳勾上。 发送一段固定长度的数据&#xff0c;然后除起始和结束的时间差 最后计算即可。

全屏字幕滚动APP:12月份广告总收:84.89元(2023年12月份) 穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益

接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 2023年12月份&#xff0c;总新增用户1242 友盟统计&#xff1a; 12月份&#xff1a;总新增用户1242 2023年12月份…

Prompt提示工程上手指南:基础原理及实践(一)

想象一下&#xff0c;你在装饰房间。你可以选择一套标准的家具&#xff0c;这是快捷且方便的方式&#xff0c;但可能无法完全符合你的个人风格或需求。另一方面&#xff0c;你也可以选择定制家具&#xff0c;选择特定的颜色、材料和设计&#xff0c;以确保每件家具都符合你的喜…

Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

IDEA创建spring boot项目的时候&#xff0c;pom.xml 文件中spring-boot-maven-plugin报红。 解决方法&#xff1a; 给spring-boot-maven-plugin指定版本 原因&#xff1a; idea自动找的插件版本是其他版本的&#xff0c;和自己设置的不同&#xff0c;导致idea在本地maven仓库…

聊一聊 C# 线程切换后上下文都去了哪里

一&#xff1a;背景 1. 讲故事 总会有一些朋友问一个问题&#xff0c;在 Windows 中线程做了上下文切换&#xff0c;请问被切的线程他的寄存器上下文都去了哪里&#xff1f;能不能给我挖出来&#xff1f;这个问题其实比较底层&#xff0c;如果对操作系统没有个体系层面的理解…

一元脱单盲盒小程序源码系统:自带流量主,低成本帮你赚钱 带完整的安装部署教程

“一元脱单盲盒”小程序源码系统是一款基于微信小程序开发的社交应用。它以盲盒的形式&#xff0c;让用户以极低的成本&#xff08;通常为一元&#xff09;尝试与陌生人建立联系。用户支付一元后&#xff0c;系统会随机匹配一位异性用户的信息&#xff08;通常是微信号或联系方…

Linux 内核调试

文章目录 一、方法论 一、方法论 qemu 虚拟机 Linux内核学习 Linux 内核调试 一&#xff1a;概述 Linux 内核调试 二&#xff1a;ubuntu20.04安装qemu Linux 内核调试 三&#xff1a;《QEMU ARM guest support》翻译 Linux 内核调试 四&#xff1a;qemu-system-arm功能选项整…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端架构搭建

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

Java接口和抽象类的区别?

Java接口和抽象类的区别&#xff1f; Java接口和抽象类的含义&#xff1a; 接口&#xff08;Interface&#xff09;&#xff1a; 含义&#xff1a; 接口是一种抽象类型&#xff0c;它定义了一组抽象方法&#xff0c;但不能包含具体实现。接口可以包含常量和默认方法&#xff0c…

单目标跟踪算法SiamRPN

目标跟踪算法包括单目标跟踪和多目标跟踪&#xff0c;单目标跟踪在每张图片中只跟踪一个目标。目前单目标跟踪的主要方法分为两大类&#xff0c;基于相关滤波(correlation filter)的跟踪算法, 如CSK&#xff0c; KCF, DCF, SRDCF等&#xff1b;基于深度学习的跟踪算法&#xff…

PPI+机器学习+免疫浸润+实验验证,如此简单也能发4+

今天给同学们分享一篇生信文章“Identification of metabolic biomarkers associated with nonalcoholic fatty liver disease”&#xff0c;这篇文章发表在Lipids Health Dis期刊上&#xff0c;影响因子为4.5。 结果解读&#xff1a; 识别NAFLD患者的MR DEG 主成分分析&…

分布式图文详解!

分布式理论 1. 说说CAP原则&#xff1f; CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;Consistency&#xff08;一致性&#xff09;、 Availability&#xff08;可用性&#xff09;、Partition tolerance&#xff08;分区容错性&#xff09;这3个基本…