洛谷 - P1034 - 矩形覆盖 - dfs
https://www.luogu.org/problemnew/show/P1034
可能是数据太水了瞎搞都可以过。
判断两个平行于坐标轴的矩形相交(含顶点与边相交)的代码一并附上。
记得这里的xy和udlr是指数学上的坐标轴。
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- struct Point{
- int x,y;
- Point(int x=,int y=){
- this->x=x,this->y=y;
- }
- }p[];
- struct Rectangle{
- int u,d,l,r;
- Rectangle(){
- u=d=l=r=-;
- }
- bool inside(Point p){
- if(p.x>=l&&p.x<=r&&p.y>=d&&p.y<=u)
- return true;
- return false;
- }
- bool intersect_help(Rectangle r2){
- Point r1p1(l,u);
- if(r2.inside(r1p1))
- return ;
- Point r1p2(r,u);
- if(r2.inside(r1p2))
- return ;
- Point r1p3(r,d);
- if(r2.inside(r1p3))
- return ;
- Point r1p4(l,d);
- if(r2.inside(r1p4))
- return ;
- return ;
- }
- bool intersect(Rectangle r2){
- if(u==-||r2.u==-)
- return ;
- if(intersect_help(r2))
- return ;
- if(r2.intersect_help(*this))
- return ;
- if(l<=r2.l&&r>=r2.r&&u<=r2.u&&d>=r2.d)
- return ;
- if(r2.l<=l&&r2.r>=r&&r2.u<=u&&r2.d>=d)
- return ;
- return ;
- }
- int area(){
- return (r-l)*(u-d);
- }
- void extend(Point p){
- if(u==-){
- l=r=p.x;
- u=d=p.y;
- return;
- }
- else{
- l=min(l,p.x);
- r=max(r,p.x);
- u=max(u,p.y);
- d=min(d,p.y);
- return;
- }
- }
- void show(){
- printf(" u=%d d=%d l=%d r=%d\n",u,d,l,r);
- }
- };
- int n,k;
- int ans=0x3f3f3f3f;
- void dfs4(int id,Rectangle r1,Rectangle r2,Rectangle r3,Rectangle r4){
- //r1.show(),r2.show(),r3.show(),r4.show();
- //printf("---------\n");
- if(id>n){
- ans=min(ans,r1.area()+r2.area()+r3.area()+r4.area());
- return;
- }
- Point pi=p[id];
- if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi)||r4.inside(pi))
- dfs4(id+,r1,r2,r3,r4);
- else{
- Rectangle rr1=r1;
- rr1.extend(pi);
- if(rr1.intersect(r2)||rr1.intersect(r3)||rr1.intersect(r4))
- ;
- else{
- dfs4(id+,rr1,r2,r3,r4);
- }
- Rectangle rr2=r2;
- rr2.extend(pi);
- if(rr2.intersect(r1)||rr2.intersect(r3)||rr2.intersect(r4))
- ;
- else{
- dfs4(id+,r1,rr2,r3,r4);
- }
- Rectangle rr3=r3;
- rr3.extend(pi);
- if(rr3.intersect(r1)||rr3.intersect(r2)||rr3.intersect(r4))
- ;
- else{
- dfs4(id+,r1,r2,rr3,r4);
- }
- Rectangle rr4=r4;
- rr4.extend(pi);
- if(rr4.intersect(r1)||rr4.intersect(r2)||rr4.intersect(r3))
- ;
- else{
- dfs4(id+,r1,r2,r3,rr4);
- }
- }
- }
- void dfs3(int id,Rectangle r1,Rectangle r2,Rectangle r3){
- //r1.show(),r2.show(),r3.show();
- //printf("---------\n");
- if(id>n){
- ans=min(ans,r1.area()+r2.area()+r3.area());
- return;
- }
- Point pi=p[id];
- if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi))
- dfs3(id+,r1,r2,r3);
- else{
- Rectangle rr1=r1;
- rr1.extend(pi);
- if(rr1.intersect(r2)||rr1.intersect(r3))
- ;
- else{
- dfs3(id+,rr1,r2,r3);
- }
- Rectangle rr2=r2;
- rr2.extend(pi);
- if(rr2.intersect(r1)||rr2.intersect(r3))
- ;
- else{
- dfs3(id+,r1,rr2,r3);
- }
- Rectangle rr3=r3;
- rr3.extend(pi);
- if(rr3.intersect(r1)||rr3.intersect(r2))
- ;
- else{
- dfs3(id+,r1,r2,rr3);
- }
- }
- }
- void dfs2(int id,Rectangle r1,Rectangle r2){
- if(id>n){
- //r1.show(),r2.show();
- int tans=r1.area()+r2.area();
- ans=min(ans,tans);
- //printf("tans=%d\n---------\n",tans);
- return;
- }
- Point pi=p[id];
- if(r1.inside(pi)||r2.inside(pi))
- dfs2(id+,r1,r2);
- else{
- Rectangle rr1=r1;
- rr1.extend(pi);
- if(rr1.intersect(r2))
- ;
- else{
- dfs2(id+,rr1,r2);
- }
- Rectangle rr2=r2;
- rr2.extend(pi);
- if(rr2.intersect(r1))
- ;
- else{
- dfs2(id+,r1,rr2);
- }
- }
- }
- void dfs(int id,Rectangle r1){
- //r1.show();
- //printf("---------\n");
- if(id>n){
- ans=min(ans,r1.area());
- return;
- }
- Point pi=p[id];
- if(r1.inside(pi))
- dfs(id+,r1);
- else{
- Rectangle rr1=r1;
- rr1.extend(pi);
- dfs(id+,rr1);
- }
- }
- int main(){
- scanf("%d%d",&n,&k);
- for(int i=;i<=n;i++){
- scanf("%d%d",&p[i].x,&p[i].y);
- }
- Rectangle r;
- switch(k){
- case :
- dfs(,r);
- break;
- case :
- dfs2(,r,r);
- break;
- case :
- dfs3(,r,r,r);
- break;
- case :
- dfs4(,r,r,r,r);
- }
- printf("%d\n",ans);
- }
加入最优性剪枝:22ms,快了3倍?
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- struct Point{
- int x,y;
- Point(int x=,int y=){
- this->x=x,this->y=y;
- }
- }p[];
- struct Rectangle{
- int u,d,l,r;
- Rectangle(){
- u=d=l=r=-;
- }
- bool inside(Point p){
- if(p.x>=l&&p.x<=r&&p.y>=d&&p.y<=u)
- return true;
- return false;
- }
- bool intersect_help(Rectangle r2){
- Point r1p1(l,u);
- if(r2.inside(r1p1))
- return ;
- Point r1p2(r,u);
- if(r2.inside(r1p2))
- return ;
- Point r1p3(r,d);
- if(r2.inside(r1p3))
- return ;
- Point r1p4(l,d);
- if(r2.inside(r1p4))
- return ;
- return ;
- }
- bool intersect(Rectangle r2){
- if(u==-||r2.u==-)
- return ;
- if(intersect_help(r2))
- return ;
- if(r2.intersect_help(*this))
- return ;
- if(l<=r2.l&&r>=r2.r&&u<=r2.u&&d>=r2.d)
- return ;
- if(r2.l<=l&&r2.r>=r&&r2.u<=u&&r2.d>=d)
- return ;
- return ;
- }
- int area(){
- return (r-l)*(u-d);
- }
- void extend(Point p){
- if(u==-){
- l=r=p.x;
- u=d=p.y;
- return;
- }
- else{
- l=min(l,p.x);
- r=max(r,p.x);
- u=max(u,p.y);
- d=min(d,p.y);
- return;
- }
- }
- void show(){
- printf(" u=%d d=%d l=%d r=%d\n",u,d,l,r);
- }
- };
- int n,k;
- int ans=0x3f3f3f3f;
- void dfs4(int id,Rectangle r1,Rectangle r2,Rectangle r3,Rectangle r4){
- //r1.show(),r2.show(),r3.show(),r4.show();
- //printf("---------\n");
- int tans=r1.area()+r2.area()+r3.area()+r4.area();
- if(tans>=ans)
- return;
- if(id>n){
- ans=min(ans,tans);
- return;
- }
- Point pi=p[id];
- if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi)||r4.inside(pi))
- dfs4(id+,r1,r2,r3,r4);
- else{
- Rectangle rr1=r1;
- rr1.extend(pi);
- if(rr1.intersect(r2)||rr1.intersect(r3)||rr1.intersect(r4))
- ;
- else{
- dfs4(id+,rr1,r2,r3,r4);
- }
- Rectangle rr2=r2;
- rr2.extend(pi);
- if(rr2.intersect(r1)||rr2.intersect(r3)||rr2.intersect(r4))
- ;
- else{
- dfs4(id+,r1,rr2,r3,r4);
- }
- Rectangle rr3=r3;
- rr3.extend(pi);
- if(rr3.intersect(r1)||rr3.intersect(r2)||rr3.intersect(r4))
- ;
- else{
- dfs4(id+,r1,r2,rr3,r4);
- }
- Rectangle rr4=r4;
- rr4.extend(pi);
- if(rr4.intersect(r1)||rr4.intersect(r2)||rr4.intersect(r3))
- ;
- else{
- dfs4(id+,r1,r2,r3,rr4);
- }
- }
- }
- void dfs3(int id,Rectangle r1,Rectangle r2,Rectangle r3){
- //r1.show(),r2.show(),r3.show();
- //printf("---------\n");
- int tans=r1.area()+r2.area()+r3.area();
- if(tans>=ans)
- return;
- if(id>n){
- ans=min(ans,tans);
- return;
- }
- Point pi=p[id];
- if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi))
- dfs3(id+,r1,r2,r3);
- else{
- Rectangle rr1=r1;
- rr1.extend(pi);
- if(rr1.intersect(r2)||rr1.intersect(r3))
- ;
- else{
- dfs3(id+,rr1,r2,r3);
- }
- Rectangle rr2=r2;
- rr2.extend(pi);
- if(rr2.intersect(r1)||rr2.intersect(r3))
- ;
- else{
- dfs3(id+,r1,rr2,r3);
- }
- Rectangle rr3=r3;
- rr3.extend(pi);
- if(rr3.intersect(r1)||rr3.intersect(r2))
- ;
- else{
- dfs3(id+,r1,r2,rr3);
- }
- }
- }
- void dfs2(int id,Rectangle r1,Rectangle r2){
- int tans=r1.area()+r2.area();
- if(tans>=ans)
- return;
- if(id>n){
- //r1.show(),r2.show();
- ans=min(ans,tans);
- //printf("tans=%d\n---------\n",tans);
- return;
- }
- Point pi=p[id];
- if(r1.inside(pi)||r2.inside(pi))
- dfs2(id+,r1,r2);
- else{
- Rectangle rr1=r1;
- rr1.extend(pi);
- if(rr1.intersect(r2))
- ;
- else{
- dfs2(id+,rr1,r2);
- }
- Rectangle rr2=r2;
- rr2.extend(pi);
- if(rr2.intersect(r1))
- ;
- else{
- dfs2(id+,r1,rr2);
- }
- }
- }
- void dfs(int id,Rectangle r1){
- //r1.show();
- //printf("---------\n");
- int tans=r1.area();
- if(tans>=ans)
- return;
- if(id>n){
- ans=min(ans,r1.area());
- return;
- }
- Point pi=p[id];
- if(r1.inside(pi))
- dfs(id+,r1);
- else{
- Rectangle rr1=r1;
- rr1.extend(pi);
- dfs(id+,rr1);
- }
- }
- int main(){
- scanf("%d%d",&n,&k);
- for(int i=;i<=n;i++){
- scanf("%d%d",&p[i].x,&p[i].y);
- }
- Rectangle r;
- switch(k){
- case :
- dfs(,r);
- break;
- case :
- dfs2(,r,r);
- break;
- case :
- dfs3(,r,r,r);
- break;
- case :
- dfs4(,r,r,r,r);
- }
- printf("%d\n",ans);
- }
洛谷 - P1034 - 矩形覆盖 - dfs的更多相关文章
- 洛谷P1034 矩形覆盖
P1034 矩形覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4( ...
- 洛谷 P1034 矩形覆盖
P1034 矩形覆盖 题目描述 在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1(1,11,1),p_2p2( ...
- [NOIP2002] 提高组 洛谷P1034 矩形覆盖
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- 洛谷——P1034 矩形覆盖
https://www.luogu.org/problem/show?pid=1034 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的 ...
- 【NOIP2002】矩形覆盖 DFS
首先,我喜欢愤怒搜索,因为尽管说K<=4,的确K小于或等于3的. 当然某些K<=3还600ms的我就不加评论了. 好吧,可是怎么搜呢?我们考虑到矩形数量非常少,所以能够怒搜矩形. 一些神做 ...
- 洛谷 P2218 [HAOI2007]覆盖问题 解题报告
P2218 [HAOI2007]覆盖问题 题目描述 某人在山上种了\(N\)棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他 ...
- P1034 矩形覆盖
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- 洛谷 P1191 矩形 题解
P1191 矩形 题目描述 给出一个 \(n \times n\)的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量 输入格式 第一行,一个整数\(n\),表示矩形的大 ...
- 洛谷P1120小木棍[DFS]
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...
随机推荐
- [转] 一句shell命令搞定代码行数统计
今天面试时,突然被面试官问到怎样用shell命令搞定某个文件夹下java代码行数的统计. 想了一下,基本思路就是找到这个文件夹下面的所有java文件,然后每个文件统计一下代码,外层套个for循环,叠加 ...
- 递归获取JSON内容的key-value值
方法主体: 使用时,请在类中先声明一个Map,參数形式例如以下: JSONObject jobj = new JSONObject(JSONContent); 首次请传递jobj.
- Android开发系列(二十一):Spinner的功能和使用方法以及实现列表选择框
Spinner是一个列表选择框.相当于弹出一个菜单供用户进行选择. Spinner继承AdapterView Spinnet支持的XML的属性: android:entries:使用数组资源设置该下拉 ...
- IE8.0登录Oracle EBS后报Oracle error 1403错
IE8.0登录Oracle EBS后报错,登录页面打开没有问题.只是输入username和password然后登录,遇到下面错误: <PRE>Oracle error 1403: java ...
- bash仅仅读的环境变量
环境变量名 变量的用途 $0 程序的名字 $1~$9 命令參数1~9的值 $* 全部命令行參数的值 $@ 全部命令行參数的值.假设$@被""包含.即"$@",这 ...
- postgres源码目录结构
1.第一级目录介绍 |_postgres |_aclocal.m4------------config用的文件的一部分 |_config----------------config文件目录 |_con ...
- LZMA C# SDK 结合 UPK 打包压缩 多目录 Unity3d实例
上篇 LZMA C# SDK 子线程压缩与解压缩 Unity3d实例 讲了怎样使用 LZMA C# SDK 来对文件进行压缩与解压,当中提到 对于多目录能够先打包成 UPK 然后再 LZMA 压缩 ...
- appium部分api
转自:http://www.aichengxu.com/view/41510 使用的语言是java,appium的版本是1.3.4,java-client的版本是java-client-2.1.0,建 ...
- node.js内存泄露问题记录
先说一下.事情的来龙去脉. 公司开发一款游戏棋牌游戏,服务端的开发是IO密集型,开发的时候,考虑过使用python,java,node.js. 终于选择了node.js(node.js宣传的杀手功能. ...
- C++的string连接(a = a + b 与 a += b)
大一学习C语言的时候,书上就写着a = a + b与 a += b等价,但是提倡用后者. 在CSDN上也看到一个关于a+=b和a=a+b的区别的帖子,大概内容如下:------------------ ...