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. PAT 甲级 1004 Counting Leaves

    https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184 A family hierarchy is ...

  2. virsh 操作kvm虚拟机

    #查看你的硬件是否支持虚拟化.命令: [root@VM_166_143 data]#egrep '(vmx|svm)' /proc/cpuinfo #安装基础包 [root@VM_166_143 da ...

  3. Flexpod的开关机顺序

    Flexpod = Cisco UCS + Cisco Nexus + Netapp (中文名叫做“融合基础架构”) 之前没有接触过这套系统,不太明白怎么个开关机的顺序,借公司停电的机会实际演练了一番 ...

  4. 一次DHCP故障排错

    关于DHCP授权,我一直遇到这样一个问题:服务器明明已经在授权列表中了,但是服务就是起不来,看日志会告诉你服务器未授权或者局域网内已有DHCP服务器,但是实际上却并不是这样.现在终于知道原因了,老旧D ...

  5. spring ioc和aop的理解

    IOC,依赖倒置的意思,所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如 ...

  6. JS选取DOM元素的方法

    摘自JavaScript权威指南(jQuery根据样式选择器查找元素的终极方式是 先用getElementsByTagName(*)获取所有DOM元素,然后根据样式选择器对所有DOM元素进行筛选) 今 ...

  7. 深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程

    Java内存模型是定义线程共享的变量的访问规则(实例字段.静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数. 1.主内存与工作内存 Java内存模型规定,所有的变量都必须存储在主内 ...

  8. MT【156】特例$a_n=\dfrac{6}{\pi n^2}$

    设无穷非负数列$\{a_n\}$满足$a_n+a_{n+2}\ge2 a_{n+1},\sum\limits_{i=1}^{n}{a_i}\le1$,证明:$0\le a_n-a_{n+1}\le\d ...

  9. SpringBoot整合Kotlin构建Web服务

    今天我们尝试Spring Boot整合Kotlin,并决定建立一个非常简单的Spring Boot微服务,使用Kotlin作为编程语言进行编码构建. 创建一个简单的Spring Boot应用程序.我会 ...

  10. Subsets II - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Subsets II - LeetCode 注意点 有重复的数字 数组可能是无序的,要先排序 解法 解法一:递归,只需要在Subsets中递归写法的基础上 ...