一 题目

二 示例及提示

三 题解

思路:

当k=1时,我们可以非常容易得到毯子填补的方案。当k=2甚至更大时,我们可以将其划分为四大块,但是公主位只有一个,而对于其他没有公主位的四方格,似乎和原问题形式不一样。但是我们可以对其加以处理,使其四个子问题都具有相同形式——即,我们可以手动为其他三个没有公主位的四方格增加新的“公主位”。例如,当公主位在左上角时,我们可以将剩余三个四方格的交界处用毯子1来补上,这样每个四方格都会被分配到一个公主位,称为特殊的方阵,问题便迎刃而解(如图所示)。因此我们就可以采用分治的方法去不断将正方形划分为4个子正方形,再分别填充,直到小正方形边长为1时,就是公主位了,不用做任何处理。

因此主要就是先判断真·公主位所在的方位里,然后选取正确的毯子填补在其他三个方位的交界处内,利用printf输出毯子所用的序号和拐角位置,再继续递归处理各个方位的四方格,直至规模为1

#include <iostream>
#include <cmath>
using namespace std;// 正方形左上角坐标xx和yy,公主坐标x和y,正方形边长k
void partition(int xx,int yy,int x,int y,int k){if(k == 1)  return;k/=2;// 左上角if(x < xx+k && y < yy+k){printf("%d %d %d\n",xx+k,yy+k,1);// 递归覆盖左上角partition(xx,yy,x,y,k);// 覆盖右下角partition(xx+k,yy+k,xx+k,yy+k,k);// 覆盖左下角partition(xx+k,yy,xx+k,yy+k-1,k);// 覆盖右上角partition(xx,yy+k,xx+k-1,yy+k,k);}// 右上角else if(x < xx+k && y >= yy+k){printf("%d %d %d\n",xx+k,yy+k-1,2);// 递归覆盖左上角partition(xx,yy,xx+k-1,yy+k-1,k);// 覆盖右下角partition(xx+k,yy+k,xx+k,yy+k,k);// 覆盖左下角partition(xx+k,yy,xx+k,yy+k-1,k);// 覆盖右上角partition(xx,yy+k,x,y,k);}// 左下角else if(x >= xx+k && y < yy+k){printf("%d %d %d\n",xx+k-1,yy+k,3);// 递归覆盖左上角partition(xx,yy,xx+k-1,yy+k-1,k);// 覆盖右下角partition(xx+k,yy+k,xx+k,yy+k,k);// 覆盖左下角partition(xx+k,yy,x,y,k);// 覆盖右上角partition(xx,yy+k,xx+k-1,yy+k,k);}// 右下角else{printf("%d %d %d\n",xx+k-1,yy+k-1,4);// 递归覆盖左上角partition(xx,yy,xx+k-1,yy+k-1,k);// 覆盖右下角partition(xx+k,yy+k,x,y,k);// 覆盖左下角partition(xx+k,yy,xx+k,yy+k-1,k);// 覆盖右上角partition(xx,yy+k,xx+k-1,yy+k,k);}
}int main()
{int x,y,k;cin >> k >> x >> y;partition(1,1,x,y,(1 << k));return 0;
}

注意:

因此,用户输入的是2的k次幂时,为确定正方形边长可以直接用左移运算符。

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

  1. 【分治】P1228 地毯填补问题(多联骨牌覆盖棋盘问题)(递归,分治)难度⭐⭐⭐

    P1228 地毯填补问题 离散上讲了这个问题,如下图 初看这个问题,似乎无从下手,于是我们可以先考虑最简单的情况,既n = 2时 0 0 0 1 这时,无论公主在哪个格子,我们都可以用一块毯子填满 继 ...

  2. 洛谷P3397 地毯

    洛谷P3397 地毯 二维差分 与一维差分类似 每次修改相当于只要修改4个地方就可以了 然后将差分数组来一次前缀和就能做好了 1 #include <cstdio> 2 #include ...

  3. P1228 地毯填补问题(Java语言实现)

    输入输出样例见原题链接:地毯填补问题 - 洛谷 这道题属于分治算法经典问题棋盘覆盖问题的衍生题.为了更好的讲解解题思路,在这里我将举一个例子,通过例子来说明,如下图,黑色方块为公主位置,其他颜色则为毛 ...

  4. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)

    P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...

  5. 洛谷-P1024-一元三次方程求解-普及-暴力/盛金公式/分治

    一 题目与示例 二 题解 1.暴力求解骗分法:D #include <iostream> #include <cmath> #include <iomanip> u ...

  6. [洛谷] P1379 八数码难题( 提高+/省选- )

    八数码 1.题目 2.分析 3.代码 1. bfs (+queue) + unordered_map 重点分析 2.双向bfs (适用于知道起始状态的情况) 思路分析 3.双向bfs优化 思路 4.总 ...

  7. 洛谷【算法1-4】递推与递归

    P1255 数楼梯 对于 100% 的数据,1≤N≤5000. 高精度斐波那契 #include <iostream> using namespace std;const int N = ...

  8. 洛谷P4292:重建计划(点分治、单调队列)

    解析 第一眼:Wow这么水的黑?? 然后写了一发二分套线段树的3log代码上去 T到飞起,只有40- 无奈瞅了一眼标签:单调队列 对啊 于是又写了一个上去 20 - 好啊 然后就摆烂了 qwq 果然黑 ...

  9. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

最新文章

  1. linux记录用户命令的日志是,用日志记录Linux用户执行的每一条命令
  2. 四位先行进位电路逻辑表达式_如何用基本的逻辑门设计32bit的超前进位加法器?...
  3. hive 的分隔符、orderby sort by distribute by的优化
  4. ppt批量缩略图_PPT如何在文件夹下显示缩略图的方法
  5. eclipse中YAML文件编辑插件:Yaml Editor插件安装
  6. c加加语言编译程序的首要工作是,选择题(综合答案)
  7. 4.6 高斯约当消元法
  8. c++控制台应用每一列数据如何对齐_懂Excel就能轻松入门Python数据分析包pandas(十六):合并数据...
  9. 优雅的读懂支持向量机 SVM 算法
  10. c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...
  11. [Android疑难杂症]动态设置TextView的width不起作用
  12. 老是说我编译版本不够_编译etcd出现的cannot load bufio的错误解决办法
  13. 语音识别如何处理工作 语音识别功能三个处理阶段
  14. Java HttpUtils 请求工具类
  15. 网页设计html对联样式代码,纯CSS做对联广告代码
  16. windows设置hosts
  17. HDU 4287 Intelligent IME 水题
  18. Mac共享主机网络给虚拟机
  19. IP地址-子网掩码-缺省网关
  20. 移动互联网领域当前的主流技术及其社会需求调查报告

热门文章

  1. SEO初学者如何正确选择SEO培训机构或老师
  2. mac电脑安装maple2017
  3. pytcuda学习笔记(一)
  4. 【uni-app】uni-app实现聊天页面功能——功能篇(下)
  5. 物流快递信息查询管理系统网站(JSP+HTML+MySQL)
  6. 【2019-CS224n】Assignment1
  7. MIT 开源协议是什么意思?底层原理是什么?
  8. Android后台监听耳机(线控、蓝牙)按键事件
  9. Could not find a package configuration file provided by “std_msg“ with any of the following names:
  10. 数据库工程师考点2023