洛谷 U91193:棋盘覆盖问题 ← 分治法
【题目来源】
https://www.luogu.com.cn/problem/U91193
【问题描述】
在一个2^k * 2^k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格。现在用4种不同形状的 L型(占3小格)骨牌覆盖棋盘上除了特殊方格以外的所有方格,且各骨牌不能重叠。 步骤为:将棋盘一分为四,依次处理左上角,右上角,左下角,右下角,递归进行。严格按照这个顺序处理。
例如,一种用不同形状的 L型骨牌覆盖填充的策略如下图所示:
【输入格式 】
输入三个数k,x,y,分别表示棋盘大小,特殊方格位置。
【输出格式】
共2^k行,每行2^k个数,每辆个数中间空格隔开。
输出按照上述顺序所覆盖的棋盘。特殊方格用0表示,其他为骨牌编号。
【算法分析】
应用分治法求解棋盘覆盖问题的技巧在于如何划分棋盘,要求是使划分后的子棋盘的大小相同,从而将原来规模较大的棋盘覆盖问题分解为规模较小的棋盘覆盖问题。
其常用技巧是,当 时,将
的棋盘划分为4个
的子棋盘。由于原棋盘只有一个特殊方格,所以这样划分后,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。然后,用一个L型骨盘覆盖这3个没有特殊方格的子棋盘的会合处,并将这三个子棋盘上被L型骨牌覆盖的方格标记为新的特殊方格。递归地使用这种分割方法,直至棋盘简化为
的棋盘,就结束递归。(注意:下图中的红色特殊方格,可以在其所在子棋盘的任意位置。下图只是示意需要选择的位置。)
上图用语言表述为:
◆左上的子棋盘(若不存在特殊方格)----则将该子棋盘右下角的那个方格假设为特殊方格
◆右上的子棋盘(若不存在特殊方格)----则将该子棋盘左下角的那个方格假设为特殊方格
◆左下的子棋盘(若不存在特殊方格)----则将该子棋盘右上角的那个方格假设为特殊方格
◆右下的子棋盘(若不存在特殊方格)----则将该子棋盘左上角的那个方格假设为特殊方格
【数据范围】
说明/提示:k<=5
【算法代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
int ans[maxn][maxn];
int id;void solve(int x1,int y1,int x2,int y2,int sz) {if(sz==1) return;int t=++id;sz/=2;int midx=x1+sz-1;int midy=y1+sz-1;if(x2<=midx && y2<=midy) { //特殊方格在左上部分,继续划分solve(x1,y1,x2,y2,sz);} else {ans[midx][midy]=t; //不在左上,覆盖左上部分的右下角solve(x1,y1,midx,midy,sz); //继续划分}if(x2<=midx && y2>midy) { //特殊方格在右上部分,继续划分solve(x1,y1+sz,x2,y2,sz);} else {ans[midx][midy+1]=t; //不在右上,覆盖右上部分的左下角solve(x1,y1+sz,midx,midy+1,sz); //继续划分}if(x2>midx && y2<=midy) { //特殊方格在左下部分,继续划分solve(x1+sz,y1,x2,y2,sz);} else {ans[midx+1][midy]=t; //不在左下,覆盖左下部分的右上角solve(x1+sz,y1,midx+1,midy,sz); //继续划分}if(x2>midx && y2>midy) { //特殊方格在右下部分,继续划分solve(x1+sz,y1+sz,x2,y2,sz);} else {ans[midx+1][midy+1]=t; //不在右下,覆盖右下部分的左上角solve(x1+sz,y1+sz,midx+1,midy+1,sz); //继续划分}
}int main() {int k,x,y;cin>>k>>x>>y;int size=(1<<k);solve(1,1,x,y,size);for(int i=1; i<=size; i++)for(int j=1; j<=size; j++) {if(j==size) printf("%d\n",ans[i][j]);else printf("%d ",ans[i][j]);}return 0;
}/*
3
1 1
ans:0 3 4 4 8 8 9 93 3 2 4 8 7 7 95 2 2 6 10 10 7 115 5 6 6 1 10 11 11
13 13 14 1 1 18 19 19
13 12 14 14 18 18 17 19
15 12 12 16 20 17 17 21
15 15 16 16 20 20 21 21
*/
【参考文献】
https://blog.csdn.net/ljw_study_in_CSDN/article/details/106409784
https://www.codenong.com/cs105800665/
https://www.cnblogs.com/crx234/p/5988055.html
https://www.cnblogs.com/yanyu01/p/8734212.html
https://blog.csdn.net/scliu12345/article/details/102387130
相关文章:

洛谷 U91193:棋盘覆盖问题 ← 分治法
【题目来源】https://www.luogu.com.cn/problem/U91193【问题描述】 在一个2^k * 2^k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格。现在用4种不同形状的 L型(占3小格)骨牌覆…...

基于OMAPL138+FPGA核心板多核软件开发组件MCSDK开发入门(下)
本文测试板卡为创龙科技 SOM-TL138F 是一款基于 TI OMAP-L138(定点/浮点 DSP C674x + ARM9)+ 紫光同创 Logos/Xilinx Spartan-6 低功耗 FPGA 处理器设计的工业级核心板。核心板内部OMAP-L138 与 Logos/Spartan-6 通过 uPP、EMIFA、I2C 通信总线连接,并通过工业级 B2B连接器引…...

熵,线性规划,半监督自监督聚类打标签
1.熵 信息熵是消除不确定性所需信息量的度量。 信息熵就是信息的不确定程度,信息熵越小,信息越确定。 对象的信息熵是正比于它的概率的负对数的,也就是 I©−log(pc) 其中n为事件的所有可能性。 为什么使用交叉熵?在机器学习…...

求极限方法总结
1.利用四则运算法则求极限 2.利用两个重要极限求极限 //0除以0型 //1的无穷次方型 3.利用等价无穷小替换替换求极限 //在等价替换时注意和差项 4.利用洛必达法则求极限 5.利用夹逼准则求极限 6.利用单调有界数列极限准则求极限 7.利用无穷小的性质求极限 8.利用函数的连续性…...

Flutter Scrollable 中ViewPort滚动原理
关于Flutter Sliver组件内容可以参考下面这位博主博客,写的已经非常好了,这里就不再赘述。 38、Flutter之 可滚动组件简介_flutter 可滑动_风雨「83」的博客-CSDN博客 通过阅读上面的博客,我们已经知道了Scrollable和Viewport基础概念&#…...
多目标粒子群结合极限学习机ELM求解帕累托前沿,MOPSO-ELM
目录 背影 parte前沿的定义 注意事项 基于多目标粒子群结合极限学习机的帕累托前沿求解帕累托前沿 主要参数 MATLAB代码 效果图 结果分析 展望 背影 在目标优化过程种,很多时候都两个或者多个目标,并且目标函数不能同时达到最优,鱼与熊掌不可兼得,这个时候可以通过求解帕…...

(二十)操作系统-信号量机制
文章目录一、知识预览二、前篇文章知识点回顾三、信号量机制四、信号量机制—整形信号量五、信号量机制—记录型信号量六、总结一、知识预览 二、前篇文章知识点回顾 进程互斥的四种软件实现方式:单标志法、双标志先检查、双标志后检查、Peterson算法。(…...
ceph osd slow ops 检测
目的 常用的方法检测 ceph slow 问题 参考 yceph -scluster:id: 22908555-e596-4c2d-a1f6-34fcf4d3e935health: HEALTH_WARNDegraded data redundancy: 46384/12805029 objects degraded (0.362%), 145 pgs degraded, 122 pgs undersized309 slow ops, oldest one blocked…...

百度CTO王海峰:深度学习平台+大模型,夯实产业智能化基座
2月27日,中国人工智能学会首届智能融合产业论坛在成都顺利举办。本届论坛由中国人工智能学会(CAAI)主办,中国人工智能学会智能融合专委会、百度公司、深度学习技术及应用国家工程研究中心和电子科技大学联合承办。中国工程院多名院…...

【C++】vector的基本使用
难道向上攀爬的那条路,不是比站在顶峰更让人热血沸腾吗? 文章目录一、vector和string的联系与不同二、vector的扩容操作1.resize() (缺省值为匿名对象)&& reserve()2.reserve在g和vs上的扩容机制3.reserve异地扩容和shri…...

社交媒体营销的5个好处
有些人认为,社交媒体营销不能直接与销售挂钩。这就是为什么在制定营销策略时,社交媒体营销会被部分人忽视的原因。然而,与其他广告渠道不同,社交媒体是双向渠道。忽视社交媒体营销将影响与客户的关系。最重要的是,它将…...

飞行机器人专栏(十)-- 异构多视角视觉系统
感知系统架构为满足天空端主控制器的诸如RGB-D图像处理等大容量数据吞吐、高速并行计算、实时运动控制以及通信和可视化任务的计算算力需求,同时优化功耗表现,采用了结构紧凑、功耗表现优异的边缘计算硬件NVIDA IJetson AGXOrin 。该开发者套件包含高性能…...

2023年湖北住建厅八大员各岗位题库精准小题库-启程别
2023年湖北住建厅八大员各岗位题库精准小题库-启程别 住建厅八大员(施工员、质量员、资料员、材料员、机械员、标准员、劳务员) 各岗位题库分2种: 1.住建厅八大员报名之后会有培训任务,完成培训任务学习才能安排考试,…...

志愿者招募令|来!一起Build OceanBase第一次开发者大会
2023 年 3 月 25 日,我们将开启第一次 OceanBase 开发者大会,走近开发者,共同探讨单机分布式、云原生、HTAP 等数据库前沿趋势,分享全新的产品 Roadmap,交流场景探索和最佳实践。 为了让活动现场更有活力,…...

java 元数据 和 元注解
基本介绍三种基本注解OverrideDeprecatedSuppressWarnings四种元注解RetentionTargetDocumentedInherited一、基本介绍1.概述java注解(Annotation)[ˌ nəˈ teɪʃn],又称java标注,也被称为元数据(关于数据的数据&…...

RFID射频卡写入手机NFC心路小记
声明: 本文仅是作者学习探索的心里路程日记,如果您看完以后,从中获得了一些知识,作者不胜荣幸。科技是一把双刃剑,利用好了,可以方便生活,利用不当也肯能扰乱公共管理秩序,造成不必要…...

【C++】STL 模拟实现之 list
文章目录一、list 的常用接口及其使用1、list 一般接口2、list 特殊接口3、list 排序的性能分析二、list 迭代器的实现1、迭代器的分类2、list 迭代器失效问题3、list 迭代器源码分析4、list 迭代器模拟实现4.1 普通迭代器4.2 const 迭代器4.3 完整版迭代器三、list 的模拟实现…...
20230228----重返学习-数组-引用数据类型的转换-基础调试用方法-对象检测-各数据转布尔值及相等运算符-条件语句-循环语句
day-017-seventeen-20230228-数组-引用数据类型的转换-基础调试用方法-对象检测-各数据转布尔值及相等运算符-条件语句-循环语句 数组 字面量表示法 [数组成员0,数组成员1,数组成员2]用中括号语法来取值 var ary [5,6,7] console.log("ary[0]--->", ary[0])数组…...
apscheduler 定时任务框架
Apscheduler 介绍 四大组件 triggers:触发器,用于设定触发任务的条件job stores:作业存储器,用于存放任务,可以存放在数据库或内存,默认内存executors:执行器,用于执行任务&#x…...

Softing OPC Tunnel——绕过DCOM配置实现OPC Classic广域网通信
一 摘要 Softing OPC Tunnel是dataFEED OPC Suite的一个组件,可避免跨设备OPC Classic通信中出现的DCOM配置问题,同时可保证跨网络数据交换的高性能和可靠性。OPC Tunnel内部集成的存储转发功能,可在连接中断时缓存数据,并在重新…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...