【洛谷P1228】地毯填补问题【分治】【递归】【DFS】

洛谷P1228 地毯填补问题 我也是服了,这道题加上我拖延,竟然整整写了一天! 不过幸好还是写出来了,这题也不太好理解 用分治的思想,真就把一个复杂的问题,一步一步拆成了小问题解决了! 首先,如果是2x2的格子最简单,不管在哪里,都有一种地毯填补;不管是4x4还是8x8,都能拆分成很多个2x2。 所以我们要做的就是先判断(x,y)在哪里方向,(比起判断0<x<len,好像的确用x-a,y-b更简便些)确定之后就能确定一个地毯,将这个地毯的三块分别看作公主站位,递归解决对应方向的所有格子 上图: 输出的坐标,x,y,a,b转 阅读详情

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P1228
用L型地毯铺满一个边长为 2k 2 k 的正方形,要求有一个特殊点不能铺且其他每个点都仅被一个地毯铺到的方案。
L型地毯为以下几种图案:
这里写图片描述


思路:

首先考虑 2×2 2 × 2 的情况。假设这个特殊点在 (1,1) ( 1 , 1 ) ,那么很明显正确的填法是这样的:
这里写图片描述
那么接下来就要扩大到 4×4 4 × 4 了:
这里写图片描述
这时候,另外三个 2×2 2 × 2 的未上色格子就没有特殊点了,也就没法像一开始的 2×2 2 × 2 的格子做。那么可不可以给每个 2×2 2 × 2 的格子都增加一个特殊点呢?
答案很明显是可以的。只要在四个 2×2 2 × 2 的格子的正中间旁边的3个白色格子都填上同一种颜色,然后再分别处理三个 2×2 2 × 2 的格子就可以!
这里写图片描述
那么再分别处理三个 2×2 2 × 2 格子,得到
这里写图片描述
那么同理,当我们扩充到 8×8 8 × 8 的格子时候,也用同样的方法,现将中间点旁边的白点标记为特殊点。
这里写图片描述
然后同理。。。
这里写图片描述
那么就可以推出 210 2 10 大小的答案啦!
假装有图片.jpg
那么,如果要我们求 210 2 10 大小的答案,那么就首先找到它的中点,判断特殊点再那边,然后就往那边递归,就变成 29×29 2 9 × 2 9 了,之后一直递归下去直到变成 2×2 2 × 2 ,然后就像上面说的一样慢慢染色输出啦!


代码:

#include <cstdio>
using namespace std;

int n,k,a[1201][1201];

void dfs(int x1,int y1,int x2,int y2,int X,int Y)
{
    if (x2-x1==1&&y2-y1==1)  //变成了2*2
    {
        if (X==x1&&Y==y1) printf("%d %d 1\n",x2,y2);
        if (X==x1&&Y==y2) printf("%d %d 2\n",x2,y1);
        if (X==x2&&Y==y1) printf("%d %d 3\n",x1,y2);
        if (X==x2&&Y==y2) printf("%d %d 4\n",x1,y1);
        return;
    }
    int x=(x2-x1+1)/2+x1-1;
    int y=(y2-y1+1)/2+y1-1;  //取出中点
    //接下来就是分治特殊点的位置,往那个方向搜索。
    if (X<=x&&Y<=y)  
    {
        dfs(x1,y1,x,y,X,Y);
        printf("%d %d 1\n",x+1,y+1);
        dfs(x+1,y1,x2,y,x+1,y);
        dfs(x+1,y+1,x2,y2,x+1,y+1);
        dfs(x1,y+1,x,y2,x,y+1);
    }
    if (X<=x&&Y>y) 
    {
        dfs(x1,y+1,x,y2,X,Y);
        printf("%d %d 2\n",x+1,y);
        dfs(x1,y1,x,y,x,y);
        dfs(x+1,y1,x2,y,x+1,y);
        dfs(x+1,y+1,x2,y2,x+1,y+1);
    }
    if (X>x&&Y<=y) 
    {
        dfs(x+1,y1,x2,y,X,Y);
        printf("%d %d 3\n",x,y+1);
        dfs(x+1,y+1,x2,y2,x+1,y+1);
        dfs(x1,y1,x,y,x,y);
        dfs(x1,y+1,x,y2,x,y+1);
    }
    if (X>x&&Y>y) 
    {
        dfs(x+1,y+1,x2,y2,X,Y);
        printf("%d %d 4\n",x,y);
        dfs(x1,y1,x,y,x,y);
        dfs(x1,y+1,x,y2,x,y+1);
        dfs(x+1,y1,x2,y,x+1,y);
    }
}

int main()
{
    int x,y;
    scanf("%d%d%d",&k,&x,&y);
    n=1;
    for (int i=1;i<=k;i++)
     n*=2;  //我就不用(1<<n)
    dfs(1,1,n,n,x,y);
    return 0;
}
洛谷P1228 地毯填补问题(上帝的递归) 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有四种选择(如图): 并且每一方格只能用一层地毯,迷宫的大小为 2k×2k 的方形。当然,也不能让公主无限制的在那儿等,对吧?由于你使用的是计算机,所以实现时间为 1s。 输入格式 输入文件共 2 行。 第一行:k,即给定被 阅读详情

相关推荐

题解:洛谷 P1228 地毯填补问题

相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。当然,也不能让公主无限制的在那儿等,对吧?并且每一方格只能用一层地毯,迷宫的大小为。为使用毯子的形状,具体见上面的图。为毯子拐角的行坐标和列坐标,#普及# #DFS-一维#

团爸讲算法 557

P1228 地毯填补问题 【分治】

题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有四种选择(如图): 并且每一方格只能用一层地毯,迷宫的大小为 2k×2k2^k\times 2^k2k×2k 的方形。当然,也不能让公主无限制的在那儿等,对吧?由于你使用的是计算机,所以实现时间为 1s1\mathrm s1

ln2037的博客 771

5V转±12V无变压器双boost电路

最近有个新项目,需要±10V范围的模拟量输出(非隔离),对于5V以下供电的控制板而言单端输出绝对没问题,可现在需要有正负输出,是少不了正负电源的,因此准备设计一个5V转±12V的电源,然后选择一个双向供电的运放,来实现单端模拟量信号向双向模拟量信号转换。 本文就来分享一下5V转±12V电源的设计。对于有类似双向电源需求的场合,大多使用变压器通过增加多个绕组来实现,而对于体积空间有要求的场合来讲,变压器实在是太大了,另外对于一些成熟的项目,变压器如果是已经设计好的,再额外增加绕组需要重新设计,费时费力。于是,

qq_30388337的博客 1万+

洛谷-P1228-地毯填补问题-普及/提高--分治+递归

一 题目 二 示例及提示 三 题解 思路: 当k=1时,我们可以非常容易得到毯子填补的方案。当k=2甚至更大时,我们可以将其划分为四大块,但是公主位只有一个,而对于其他没有公主位的四方格,似乎和原问题形式不一样。但是我们可以对其加以处理,使其四个子问题都具有相同形式——即,我们可以手动为其他三个没有公主位的四方格增加新的“公主位”。例如,当公主位在左上角时,我们可以将剩余三个四方格的交界处用毯子1来补上,这样每个四方格都会被分配到一个公主位,称为特殊的方阵,问题便迎刃而解。因此我们就可以

哼 2170

手把手教你用手机号注册的Apple ID成功登录Developer账户(避坑指南)

本文详细解析了使用手机号注册的Apple ID登录开发者账户时常见的'不符合使用条件'报错问题,并提供了从添加可验证邮箱到设置主账号的四步解决方案。特别针对Apple Developer账户的验证机制,帮助开发者避免因邮箱缺失导致的登录失败,提升账户激活成功率。

z5a6b的博客 1220

通达信强龙趋势幅图指标 - 精准捕捉趋势,把握强势行情,多角度分析个股,强弱一目了然

STICKLINE(趋势>0 AND SJTJ,4.8,5.8,1.5,0),COLORYELLOW;STICKLINE(资金>0 AND SJTJ,1.2,2.2,1.5,0),COLOR0080FF;STICKLINE(异动>0 AND SJTJ,0,1,1.5,0),COLORFF0080;STICKLINE(异动=0 AND SJTJ,0,1,1.5,1),COLORGRAY;

Q1809330692的博客 5629

【题解】【洛谷P1228】【分治】——地毯填补问题

相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。当然,也不能让公主无限制的在那儿等,对吧?此时公主在左上角,需要使右上角,左下角和右下角都有公主。并且每一方格只能用一层地毯,迷宫的大小为。直接处理这么大的一块地毯是很难的。只需要根据上面的形式,铺垫相应的。为使用毯子的形状,具体见上面的图。为毯子拐角的行坐标和列坐标,

Pantheraonca的博客 1384

pta——特立独行的幸福

这是我认为比较复杂的一道题了,比较迷茫的点在于不知道要算各位平方和几次到不了1,才算他不是幸福数。突破口在于如果如果不是回到1也会有一些数字重复出现,只要重复出现的数字不是1,那就不是幸福数

m0_65620244的博客 4035

洛谷题单 算法1-4 递推与递归

1 栈 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。 栈有两种最重要的操作,即 pop(从栈顶弹出一个元素)和 push(将一个元素进栈)。 栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。 题目描述 宁宁考虑的是这样一个问题:一个操作数序列,1,2,…,n(图示为 1 到 3 的情况),栈 A 的深度大于 n。 现在可以进行两种操作, 将一个数,从操作数

付某人的博客 1496

差分式升压逆变器MATLAB仿真模型设计——实现110V/50Hz输出电压与THD<5%

差分式升压逆变器MATLAB仿真设计 摘要 本文提出一种基于差分式升压逆变器(DBI)的MATLAB仿真设计方案,实现80V直流输入转换为110V/50Hz交流输出。该方案采用单级升压逆变拓扑结构,相比传统两级方案具有更高的功率密度和效率。通过建立数学模型,设计SPWM调制策略和电压闭环PI控制,并在MATLAB/Simulink中构建完整仿真模型。仿真结果表明,系统输出电压THD<5%,满足设计要求。文章详细阐述了主电路参数计算、控制策略实现和仿真验证过程,为实际工程应用提供了理论依据和技术参考。

huanghm88的专栏 121

自动识别象棋棋子的OpenCV应用

在计算机视觉领域,OpenCV是一个广泛应用的开源计算机视觉库,它提供了丰富的图像处理和分析工具。本文将介绍如何使用OpenCV实现自动识别象棋棋子的功能,并提供相应的源代码。通过以上代码,我们可以实现对棋盘图像中棋子的自动识别。需要注意的是,以上代码只是一个简单的示例,实际应用中可能需要根据具体情况进行参数调整和算法优化,以获得更好的识别效果。函数利用预处理后的图像,寻找图像中的轮廓,并根据轮廓的面积筛选出可能的棋子轮廓,最后在原图像中提取棋子区域。在主程序中,我们读取输入图像,并调用。

WzisTypescript的博客 907

洛谷P1228 地毯填补问题(最容易理解的题解)

洛谷P1228 地毯填补问题(最容易理解的题解)

weixin_59867637的博客 903

safetymonitorapi

Summary of SA8653 Safety Monitor API Introduction This document details Safety Monitor APIs for the SA8653 QNNX platform, covering dual interfaces of APSS and SAIL. It defines core data structures and enumerations for subsystems, fault severity and health

qq_39257814的博客 1588

洛谷 P1228 地毯填补问题

宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。将迷宫填补完整的方案:每一补(行)为 x y c(x,y 为毯子拐角的行坐标和列坐标,c 为使用毯子的形状,具体见上面的图 1,毯子形状分别用 1,2,3,4 表示,x,y,c 之间用一个空格隔开)。第二行两个整数 x,y,即给出公主所在方格的坐标(x 为行坐标,y 为列坐标),x 和 y 之间有一个空格隔开。

2401_87918203的博客 253

【肌电处理】肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率【含Matlab源码 3386期】

肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 822

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

P1228 地毯填补问题【洛谷算法习题】

摘要:P1228 地毯填补问题要求用四种L型地毯覆盖$2^k×2^k$棋盘,公主所在方格除外。采用分治递归策略:将棋盘四等分,判断公主所在象限,在中心交界处铺设L型地毯(形成三个虚拟特殊点),递归处理每个子象限。算法时间复杂度$O(4^k)$,通过坐标计算和递归调用实现地毯填补,输出每块地毯的位置和形状编号。代码使用深度优先搜索实现分治过程,确保覆盖完整且符合题目要求。

Pretty Boy Fox的博客 535

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

分治:地毯填补问题

此题解答做简略化处理。需要细心。

2403_86817821的博客 356

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

洛谷-地毯填补

最上面那位博主里面有分析,最重要的就是被覆盖格子在其他象中就相当于是有一位公主,可以把它看成是公主来递归。弄了快两个小时了终于理解并会自己打出来了。

2301_79745277的博客 303

算法题(170):地毯填补问题

此时我们其实可以将矩阵分为四部分,每部分都是k为1的情况的矩阵,对于包含公主的那一部分我们可以直接利用上情况1的方法,对于其他三部分我们则可以铺设一块恰好包含这三部分的地毯,从而让其他三部分都有障碍物,进而可以完全利用k=1的解决方法解决k=2的问题。我们不要一上来就直接分析最难的情况,我们先分析k为1的情况。一共有四种情况,我们只需要选择不包含障碍物的地毯即可。本题需要我们找出地毯的铺设方式并将铺设方式打印出来。k为1也就是长度为2^1的情况,此时矩阵为2*2。

2301_79954395的博客 271

分治思想的应用

模拟时的分治思想的应用,一维数据的分治,二维数据的分治

m0_73693552的博客 638

智力小游戏,99%都做不出来?

洛谷P1228 地毯填补问题

2505_94379419的博客 180

棋盘覆盖问题(暴力 + 分治)

洛谷P1228 地毯填补问题 题意: 用如图所示的四种方块填充一个边长为2k2^k2k的正方形,其中正方形坐标为(x,y)的点不能被填充,需要空出。输出任意一种方案。(每个填充的方块输出其拐角坐标) 思路: 考虑由简到繁,对于k=1时,假设这个特殊点在(2,2),那么很明显正确的填法是这样的: k=2时 k=3时 观察图片,我们可以发现,在大正方形最中间加一个(缺口朝向当前大正方形的空缺格子)的填充块,使得把大正方形分成四个等边长的小正方形后,每个小正方形中都有一个空缺格子。递归这个操作,当边长为1

weixin_45722843的博客 255

洛谷——P1003 铺地毯

现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。接下来的 n 行中,第 i+1 行表示编号 i 的地毯的信息,包含四个整数 a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标 (a,b) 以及地毯在 x 轴和 y 轴方向的长度。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。第 n + 2 行包含两个整数 x 和 y,表示所求的地面的点的坐标 (x,y)。输出共 1 行,一个整数,表示所求的地毯的编号;

明里灰的博客 701

地毯填补问题

作业

weixin_72093276的博客 676

P1228 地毯填补问题(递归)

题目传送门 题意: 给你一张大小为2k * 2k 的地图,你要用4种地毯去填充这张地图,规定有一个点不能填,每个格子只能被一张地毯覆盖,让你输出覆盖方案。(方案为第i种地毯在点(x,y)处拐角) 地毯样式: 如果在一个2 * 2的地图里,我们显然直接用一种给它补全就行。 如果在一个4 * 4的地图里,我们完成以下操作后,需要补全其他部分。 假如我们把2 * 2看做一个整体,每个小整体分别还能放下一个地毯,但是每个小整体都会多出一个小块来,我们就让这三个小块形成一块地毯,这样就行了。 然后由小到大,这个

Joker_He的博客 975
上一篇: 【洛谷P1119】灾后重建【最短路】
下一篇: 【JZOJ 5459】密室【最短路】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值