Description

相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有四种选择(如图4-l):



并且每一方格只能用一层地毯,迷宫的大小为(2k)^2的方形。当然,也不能让公主无限制的在那儿等,对吧?由于你使用的是计算机,所以实现时间为1s。

输入格式:输入文件共2行。

第一行:k,即给定被填补迷宫的大小为2^k(0<k≤10);

第二行:x y,即给出公主所在方格的坐标(x为行坐标,y为列坐标),x和y之间有一个空格隔开。

输出格式:

将迷宫填补完整的方案:每一补(行)为x y c (x,y为毯子拐角的行坐标和列坐标,c为使用毯子的形状,具体见上面的图1,毯子形状分别用1、2、3、4表示,x、y、c之间用一个空格隔开)。

Solution

1.经典的棋盘覆盖问题,考虑将问题化为小的子状态,分而治之;

2.首先对于一个棋盘,我们考虑把它等分成边长为原来一半的四个小棋盘,那么污点肯定在四个棋盘中的一个里,那么我们在分割点处,其他三个无污点的棋盘上,靠近分割点的格点上放上地毯,并递归处理四个小的棋盘;

3.在小的棋盘中,若原来污点就在其中,则按上述原则处理,若不在,则把上一层铺地毯的定点视为污点,按上述原则处理;

4.在传参时,若已经分割成边长等于2时,直接判断污点的位置,在另三个格子中铺同一块地毯即可;

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std; inline int read(){
int x=0;
bool f=true;
char c;
c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=false;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return f?x:-x;
} void apart(int tpx,int tpy,int sz,int bpx,int bpy){
if(sz==2){
if(bpx==tpx&&bpy==tpy)printf("%d %d %d\n",tpx+1,tpy+1,1);
if(bpx==tpx&&bpy==tpy+1)printf("%d %d %d\n",tpx+1,tpy,2);
if(bpx==tpx+1&&bpy==tpy)printf("%d %d %d\n",tpx,tpy+1,3);
if(bpx==tpx+1&&bpy==tpy+1)printf("%d %d %d\n",tpx,tpy,4);
return;
};
int mid=sz/2; //把区间划分成边长为原来一半的四个等面积矩形
//处理左上角的四分之一矩阵:
if(bpx<tpx+mid&&bpy<tpy+mid){
apart(tpx,tpy,mid,bpx,bpy);
printf("%d %d %d\n",tpx+mid,tpy+mid,1);
}
else apart(tpx,tpy,mid,tpx+mid-1,tpy+mid-1); //处理左下角四分之一的矩阵:
if(bpx<tpx+mid&&bpy>=tpy+mid){
apart(tpx,tpy+mid,mid,bpx,bpy);
printf("%d %d %d\n",tpx+mid,tpy+mid-1,2);
}
else apart(tpx,tpy+mid,mid,tpx+mid-1,tpy+mid); //处理右上角四分之一的矩阵:
if(bpx>=tpx+mid&&bpy<tpy+mid){
apart(tpx+mid,tpy,mid,bpx,bpy);
printf("%d %d %d\n",tpx+mid-1,tpy+mid,3);
}
else apart(tpx+mid,tpy,mid,tpx+mid,tpy+mid-1); //处理右下角四分之一的矩阵:
if(bpx>=tpx+mid&&bpy>=tpy+mid){
apart(tpx+mid,tpy+mid,mid,bpx,bpy);
printf("%d %d %d\n",tpx+mid-1,tpy+mid-1,4);
}
else apart(tpx+mid,tpy+mid,mid,tpx+mid,tpy+mid);
} int main(){
int k,x,y,size=1;
k=read();
for(int i=1;i<=k;++i) size*=2;
x=read();
y=read();
apart(1,1,size,x,y);
return 0;
}

关于棋盘覆盖问题更系统的讲解:https://wenku.baidu.com/view/e331f06c336c1eb91a375d75.html

关于棋盘覆盖问题推荐题目:https://www.luogu.org/problemnew/show/T24245

[洛谷P1228]地毯填补问题 题解(分治)的更多相关文章

  1. 浅谈分治 —— 洛谷P1228 地毯填补问题 题解

    如果想看原题网址的话请点击这里:地毯填补问题 原题: 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子 ...

  2. 洛谷P1228 地毯填补问题

    P1228 地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站 ...

  3. P1228 地毯填补问题(分治)

    P1228 地毯填补问题(分治) 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将 ...

  4. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  5. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  6. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  7. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  8. 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)

    推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...

  9. 洛谷P4220 [WC2018]通道(边分治+虚树)

    题面 传送门 题解 代码不就百来行么也不算很长丫 虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边 ...

随机推荐

  1. vSphere Client 连接ESXi 或者是vCenter 时虚拟机提示VMRC异常的解决办法

    1. 自己的vSphere 连接vCenter 向管理虚拟机 结果发现总是有异常. 提示如图示 VMRC控制台的连接已经断开 2. 花了比较长的时间也没搞定. 后来百度发现 关闭一个进程 然后重新登录 ...

  2. [转帖]CentOS基础命令大全

    https://www.toutiao.com/i6601298434651587085/ 1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init ...

  3. Java 使用 DBCP mysql 连接池 做数据库操作

    需要的jar包有 commons-dbutils , commons-dbcp , commons-pool , mysql-connector-java 本地database.propertties ...

  4. (暂时弃坑)ACM数论之旅15---置换群与Polya定理(我把标题看成poi了,poipoipoi(*≧▽≦)ツ)

    (挖坑...) ////////////////////////////////////////////////// 暂时弃坑 开学了,有空再写....

  5. delphi(假三层之数据访问层)(第一天)

    本论文主要是通过三天来讲解三层的结构,今天是第一天,先讲解一下delphi下的Models层,我主要封装了两个查询得到数据集的函数,主要是通过在表示层上创建的数数据集控件传递进来,通过业务逻辑对语句的 ...

  6. 安装pycharm软件后,打开robot framework怎么默认用pycharm打开

    1.打开ride.py的属性,修改打开方式

  7. 【大数据】Kafka学习笔记

    第1章 Kafka概述 1.1 消息队列 (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息 ...

  8. 【刷题】BZOJ 2346 [Baltic 2011]Lamp

    Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...

  9. Linux下的bash对拍

    下面是Linux下的bash对拍程序: #!/bin/bash t=0 //数据组数 while true; do let "t=$t + 1" echox printf $t / ...

  10. 20165218 《网络对抗技术》Exp3 免杀原理与实践

    Exp3 免杀原理与实践 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧 使用VirusTotal或 ...