洛谷-P1228-地毯填补问题-普及/提高--分治+递归
一 题目
二 示例及提示
三 题解
思路:
当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-地毯填补问题-普及/提高--分治+递归相关推荐
- 【分治】P1228 地毯填补问题(多联骨牌覆盖棋盘问题)(递归,分治)难度⭐⭐⭐
P1228 地毯填补问题 离散上讲了这个问题,如下图 初看这个问题,似乎无从下手,于是我们可以先考虑最简单的情况,既n = 2时 0 0 0 1 这时,无论公主在哪个格子,我们都可以用一块毯子填满 继 ...
- 洛谷P3397 地毯
洛谷P3397 地毯 二维差分 与一维差分类似 每次修改相当于只要修改4个地方就可以了 然后将差分数组来一次前缀和就能做好了 1 #include <cstdio> 2 #include ...
- P1228 地毯填补问题(Java语言实现)
输入输出样例见原题链接:地毯填补问题 - 洛谷 这道题属于分治算法经典问题棋盘覆盖问题的衍生题.为了更好的讲解解题思路,在这里我将举一个例子,通过例子来说明,如下图,黑色方块为公主位置,其他颜色则为毛 ...
- 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)
P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...
- 洛谷-P1024-一元三次方程求解-普及-暴力/盛金公式/分治
一 题目与示例 二 题解 1.暴力求解骗分法:D #include <iostream> #include <cmath> #include <iomanip> u ...
- [洛谷] P1379 八数码难题( 提高+/省选- )
八数码 1.题目 2.分析 3.代码 1. bfs (+queue) + unordered_map 重点分析 2.双向bfs (适用于知道起始状态的情况) 思路分析 3.双向bfs优化 思路 4.总 ...
- 洛谷【算法1-4】递推与递归
P1255 数楼梯 对于 100% 的数据,1≤N≤5000. 高精度斐波那契 #include <iostream> using namespace std;const int N = ...
- 洛谷P4292:重建计划(点分治、单调队列)
解析 第一眼:Wow这么水的黑?? 然后写了一发二分套线段树的3log代码上去 T到飞起,只有40- 无奈瞅了一眼标签:单调队列 对啊 于是又写了一个上去 20 - 好啊 然后就摆烂了 qwq 果然黑 ...
- 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...
最新文章
- linux记录用户命令的日志是,用日志记录Linux用户执行的每一条命令
- 四位先行进位电路逻辑表达式_如何用基本的逻辑门设计32bit的超前进位加法器?...
- hive 的分隔符、orderby sort by distribute by的优化
- ppt批量缩略图_PPT如何在文件夹下显示缩略图的方法
- eclipse中YAML文件编辑插件:Yaml Editor插件安装
- c加加语言编译程序的首要工作是,选择题(综合答案)
- 4.6 高斯约当消元法
- c++控制台应用每一列数据如何对齐_懂Excel就能轻松入门Python数据分析包pandas(十六):合并数据...
- 优雅的读懂支持向量机 SVM 算法
- c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...
- [Android疑难杂症]动态设置TextView的width不起作用
- 老是说我编译版本不够_编译etcd出现的cannot load bufio的错误解决办法
- 语音识别如何处理工作 语音识别功能三个处理阶段
- Java HttpUtils 请求工具类
- 网页设计html对联样式代码,纯CSS做对联广告代码
- windows设置hosts
- HDU 4287 	Intelligent IME 水题
- Mac共享主机网络给虚拟机
- IP地址-子网掩码-缺省网关
- 移动互联网领域当前的主流技术及其社会需求调查报告
热门文章
- SEO初学者如何正确选择SEO培训机构或老师
- mac电脑安装maple2017
- pytcuda学习笔记(一)
- 【uni-app】uni-app实现聊天页面功能——功能篇(下)
- 物流快递信息查询管理系统网站(JSP+HTML+MySQL)
- 【2019-CS224n】Assignment1
- MIT 开源协议是什么意思?底层原理是什么?
- Android后台监听耳机(线控、蓝牙)按键事件
- Could not find a package configuration file provided by “std_msg“ with any of the following names:
- 数据库工程师考点2023