洛谷 U91193:棋盘覆盖问题 ← 分治法

news2024/9/20 16:44:48

【题目来源】
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表示,其他为骨牌编号。

【算法分析】
应用分治法求解棋盘覆盖问题的技巧在于如何划分棋盘,要求是使划分后的子棋盘的大小相同,从而将原来规模较大的棋盘覆盖问题分解为规模较小的棋盘覆盖问题。
其常用技巧是,当 k>0 时,将 {\color{Red} 2^k\times 2^k} 的棋盘划分为4个 {\color{Red} 2^{k-1}\times 2^{k-1}} 的子棋盘。由于原棋盘只有一个特殊方格,所以这样划分后,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。然后,用一个L型骨盘覆盖这3个没有特殊方格的子棋盘的会合处,并将这三个子棋盘上被L型骨牌覆盖的方格标记为新的特殊方格。递归地使用这种分割方法,直至棋盘简化为1\times 1 的棋盘,就结束递归。(注意:下图中的红色特殊方格,可以在其所在子棋盘的
任意位置。下图只是示意需要选择的位置。

上图用语言表述为:
◆左上的子棋盘(若不存在特殊方格)----则将该子棋盘
右下角的那个方格假设为特殊方格
◆右上的子棋盘(若不存在特殊方格)----则将该子棋盘
左下角的那个方格假设为特殊方格
◆左下的子棋盘(若不存在特殊方格)----则将该子棋盘
右上角的那个方格假设为特殊方格
◆右下的子棋盘(若不存在特殊方格)----则将该子棋盘
左上角的那个方格假设为特殊方格

【数据范围】
说明/提示: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  9
 3  3  2  4  8  7  7  9
 5  2  2  6 10 10  7 11
 5  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
 

 

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

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

相关文章

java 元数据 和 元注解

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

Kotlin学习:5.2、异步数据流 Flow

Flow一、Flow1、Flow是什么东西&#xff1f;2、实现功能3、特点4、冷流和热流5、流的连续性6、流的构建器7、流的上下文8、指定流所在协程9、流的取消9.1、超时取消9.2、主动取消9.3、密集型任务的取消10、背压和优化10.1、buffer 操作符10.2、 flowOn10.3、conflate 操作符10.…

Substrate 基础 -- 教程(Tutorials)

官网 github DOC 面向未来的区块链框架 Substrate 使开发人员能够快速、轻松地构建适合任何用例的未来 证明区块链(future proof blockchains)。 Substrate 文档包括区块链构建器&#xff08;blockchain builders&#xff09;和parachain 项目团队的概念、过程和参考信息。…

Nginx面试问题总结

1. 什么是Nginx&#xff1f;Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0c;官方监测能支持5万并发&#xff0c;现在中国使用nginx网站用户有很多&#xff0c;例如&#xff1a…

阿里淘宝新势力造型合伙人P8、年薪百万的欧阳娜娜也躲不过的魔鬼面试,看的我心服口服

阿里淘宝新势力造型合伙人P8、年薪百万的欧阳娜娜跳槽了&#xff0c;这不是关键。 她参加了网易有道明星语音录音员/代言人的面试&#xff0c;这也不是关键。 关键是她教科书式的面试过程&#xff0c;狠狠地给我们上了一课。 我是无意间刷到的这个视频的时候&#xff0c;就一…

u盘文件夹空的但u盘内存显示满的,怎么找回文件?

最近&#xff0c;我朋友抱怨自己的u盘满了&#xff0c;但是文件夹却是空空如也。他焦急地问我&#xff0c;这到底是怎么回事&#xff1f;我给他分析了一些常见的原因。首先&#xff0c;可能是因为u盘感染了病毒&#xff0c;将文件夹里面的文件隐藏了&#xff1b;其次&#xff0…

9大插件,21张配图,编码路上助你起飞

大家好&#xff0c;我是阿Q&#xff0c;很高兴又跟大家见面了。 看过我以往文章的小伙伴可能会发现&#xff0c;我的大部分文章都偏向于实战。我的文章风格也是先理论后实战&#xff0c;有了落地的理论才能帮助大家更好的理解。 最近有好多小伙伴后台私信我&#xff0c;问我有…

你问我答|虚拟机、容器和无服务器,怎么选?

在新技术层出不穷的当下,每家企业都希望不断降低成本,并提高运营效率,一个方法就是寻找不同的技术方案来优化运营。      例如,曾经一台服务器只能运行一个应用(裸机);接着,一台服务器的资源可以划分为多个块,从而运行多个应用(虚拟化);再到后来,应用越来越多,为了方便它们…

【牛客刷题专栏】0x0E:JZ6 从尾到头打印链表(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…

互联网衰退期,测试工程师35岁之路怎么走...

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…

Windows平台Unity Camera场景实现轻量级RTSP服务和RTMP推送

技术背景随着VR技术在医疗、军事、农业、学校、景区、消防、公共安全、研学机构、展厅展馆&#xff0c;商场等场所普及&#xff0c;开发者对Unity平台下的直播体验提出了更高的要求。技术实现Unity平台下的RTMP推流、RTMP、RTSP播放前几年已经覆盖了Windows、Linux、Android、i…

华为OD机试题,用 Java 解【内存资源分配】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

蓝蓝算法二期工程day3,一万年太久,只争朝夕

思路&#xff1a; 最好想的是用hashmap&#xff0c;当然用c的话也可以用两个数组&#xff0c;一个数组用于存放字符串&#xff0c;自动对应ACSII码&#xff0c;一个将对应ACSII码的数字对应其下标&#xff0c;当然这也是用的映射的思想。 import java.util.*;public class Cac…

【蓝桥杯选拔赛真题38】python目标值判断 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python目标值判断 一、题目要求 1、编程实现 2、输入输出 二、解题思路

47个SQL性能优化技巧,看到就是赚到

1、先了解MySQL的执行过程 了解了MySQL的执行过程&#xff0c;我们才知道如何进行sql优化。 &#xff08;1&#xff09;客户端发送一条查询语句到服务器&#xff1b; &#xff08;2&#xff09;服务器先查询缓存&#xff0c;如果命中缓存&#xff0c;则立即返回存储在缓存中的…

Linux 内核 container_of 宏详解

目录 前言 1、container_of 宏介绍 2、container_of 宏的使用示例 3、container_of 宏实现原理分析 3.1 结构体在内存中的存储 3.2 计算成员变量在结构体内的偏移 3.3 container_of 宏的原理实现 4、总结 前言 本章内容会涉及到的基础知识有 typeof关键字 和 语句表达…

django-博客(一)

一、 1、环境&#xff1a;pycharm&#xff0c;python3.6&#xff0c;django3&#xff0c;mysql8.0 2、创建项目 3、把html和css样式那些导入到文件夹中&#xff0c;​​​​​​然后配置这些文件夹的路径&#xff0c;再添加首页视图。 改成反向解析 python manage.py runserv…

ElasticSearch 学习笔记总结(三)

文章目录一、ES 相关名词 专业介绍二、ES 系统架构三、ES 创建分片副本 和 elasticsearch-head插件四、ES 故障转移五、ES 应对故障六、ES 路由计算 和 分片控制七、ES集群 数据写流程八、ES集群 数据读流程九、ES集群 更新流程 和 批量操作十、ES 相关重要 概念 和 名词十一、…

熵,线性规划,半监督自监督聚类打标签

1.熵 信息熵是消除不确定性所需信息量的度量。 信息熵就是信息的不确定程度&#xff0c;信息熵越小&#xff0c;信息越确定。 对象的信息熵是正比于它的概率的负对数的&#xff0c;也就是 I©−log(pc) 其中n为事件的所有可能性。 为什么使用交叉熵&#xff1f;在机器学习…

分析设备故障时间和次数,打破生产瓶颈?包在虹科身上

前言 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶颈&#xff0c;有效地实现生产目标呢&#xff1f;…