<模板> 矩形分割
来源:互联网 发布:多空博弈指标源码 编辑:程序博客网 时间:2024/06/11 19:42
描述
N个不同的颜色的不透明的长方形(1 <= N <= 1000)被放置在一张横宽为A竖长为B的白纸上。这些长方形被放置时,保证了它们的边与白纸的边缘平行。所有的长方形都放置在白纸内,所以我们会看到不同形状的各种颜色。坐标系统的原点(0,0)设在这张白纸的左下角,而坐标轴则平行于边缘。
[编辑]格式
PROGRAM NAME: rect1
INPUT FORMAT:
(file rect1.in)
按顺序输入放置长方形的方法。第一行输入的是那个放在底的长方形(即白纸)。
第 1 行: A , B 和 N由空格分开 (1 <=A, B<=10,000)
第 2 到N+1行: 为五个整数 llx, lly, urx, ury, color 这是一个长方形的左下角坐标,右上角坐标(x+1,y+1)和颜色。
颜色 1和底部白纸的颜色相同。 (1 <= color <= 2500)
OUTPUT FORMAT:
(file rect1.out)
输出且仅输出所有能被看到颜色,和该颜色的总面积(可以由若干个不连通的色块组成),按color增序排列。
[编辑]SAMPLE INPUT
20 20 32 2 18 18 20 8 19 19 38 0 10 19 4
[编辑]SAMPLE OUTPUT
1 912 843 1874 38
矩形集合中已有矩形(x1,y1,x2,y2),现加入矩形(x3,y3,x4,y4)。它们的位置关系可以有很多种(有17种之多),这里就不一一列举了。但无论它们的位置关系如何复杂,运用线段切割的思想来进行矩形切割,就会变得十分明了。我们将矩形的切割正交分解,先进行x方向上的切割,再进行y方向的切割。如下图所示:
插入矩形(x3,y3,x4,y4)后,对矩形(x1,y1,x2,y2)进行切割。
- Step 1:首先从x方向上切。把线段(x1,x2)切成(x1,x3),(x4,x2)两条线段。于是相应地,我们就把两个矩形切了出来——(x1,y1,x3,y2),(x4,y1,x2,y2)。把它们加到矩形集合中。去掉了这两个矩形后,我们要切的矩形就变为(x3,y1,x4,y2)。
- Step 2:接着我们再进行y方向上的切割。把线段(y1,y2)切成(y1,y3)。相应地又得到一个矩形(x3,y1,x4,y2)。把它放入矩形集合。
- Step 3:剩下的矩形为(x3,y3,x4,y2),这个矩形已经被矩形(x3,y3,x4,y4)覆盖了,因此直接把它删掉。
我们可以归纳出矩形切割的思想:
- 1、先对被切割矩形进行x方向上的切割。取(x1,x2),(x3,x4)的交集(k1,k2)
①若x1<k1,则加入矩形(x1,y1,k1,y2)
②若k2<x2,则加入矩形(k2,y1,x2,y2)
- 2、再对切剩的矩形(k1,y1,k2,y2) 进行y 方向上的切割。取(y1,y2),(y3,y4)的交集(k3,k4)
① 若y1<k3,则加入矩形(k1,y1,k2,k3)
②若k4<y2,则加入矩形(k1,k4,k2,y2)
- 3、把矩形(x1,y1,x2,y2)从矩形集合中删除。
Procedure Cut(x1,y1,x2,y2,Direction)Var k1,k2 Begin Case Direction of 1:Begin k1 ← Max(x1,x3) {计算线段(x1,x2),(x3,x4)交集的左边界} k2 ← Min(x2,x4) {计算线段(x1,x2),(x3,x4)交集的右边界} if x1<k1 then Add(x1,y1,k1,y2) if k2<x2 then Add(k2,y1,x2,y2) Cut(k1,y1,k2,y2,Direction+1) End 2:Begin k1 ← Max(y1,y3) k2 ← Min(y2,y4) if y1<k1 then Add(x1,y1,x2,k1) if k2<y2 then Add(x1,k2,x2,y2) End EndEnd
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <queue>#include <map>#include <stack>#include <list>#include <vector>#define LL __int64using namespace std;struct node{int lx,ly,rx,ry,cl;}f[1010];int ans[10010];void DFS(int lx,int ly,int rx,int ry,int t){if (t==0) return;if (f[t].lx>=rx || f[t].rx<=lx || f[t].ly>=ry || f[t].ry<=ly )DFS(lx,ly,rx,ry,t-1);else{int k1=max(lx,f[t].lx);int k2=min(rx,f[t].rx);if (lx<k1)DFS(lx,ly,k1,ry,t-1);if (rx>k2)DFS(k2,ly,rx,ry,t-1);int k3=max(ly,f[t].ly);int k4=min(ry,f[t].ry);if (ly<k3)DFS(k1,ly,k2,k3,t-1);if (ry>k4)DFS(k1,k4,k2,ry,t-1);ans[f[t].cl]+=abs(k2-k1)*abs(k4-k3);ans[1]-=abs(k2-k1)*abs(k4-k3);}}int main(){int n,m,k,i;scanf("%d%d%d",&n,&m,&k);for (i=1;i<=k;i++)scanf("%d%d%d%d%d",&f[i].lx,&f[i].ly,&f[i].rx,&f[i].ry,&f[i].cl);memset(ans,0,sizeof(ans));ans[1]=n*m;DFS(0,0,n,m,k);for (i=1;i<=n;i++)if (ans[i])printf("%d %d\n",i,ans[i]);return 0;}
- <模板> 矩形分割
- 矩形分割
- 矩形分割
- 分割矩形
- [贪心] 矩形分割
- sgu177:Square(矩形分割)
- 【TYVJ】1094 矩形分割
- P1094 矩形分割|tyvj
- 【tyvj1094】矩形分割 贪心
- 二分-矩形分割
- NOI-OJ矩形分割
- 03:矩形分割
- HDU 3265(矩形面积并-分割矩形)
- 矩形分割(动态规划)
- USACO / Shaping Regions (矩形分割)
- 卫星覆盖 (几何+矩形分割)
- Tyvj专题 P1094 矩形分割
- 03:矩形分割 来源OJ
- suse linux 11 error: gnu/stubs-32.h: 没有那个文件或目录 解决方法
- 8.12NOI(P)模拟
- 实现tomcat网页个性化标签栏图标
- 学习日记之中介者模式和Effective C++
- HDU1203,I NEED A OFFER!
- <模板> 矩形分割
- angularjs(step by step):controller
- sscanf函数具体用法
- poj1472
- python xml.sax.handler.ContentHandler 的characters方法小结
- Linux I2C子系统驱动阐述
- LeetCode-Insert Interval
- BJOI2014 2014.8.13
- 01.策略模式 【STRATEGY PATTERN】