•题意
给你三个矩形,依次编号为 1,2,3;
判断 矩形1 是否被 矩形2 和 矩形3 完全覆盖;
如果没有完全覆盖,输出 "YES",反之,输出 "NO";
•题解
我是用扫描线做的;
首先,定义如下数据结构:
1 struct Data 2 { 3 int x; 4 int y1,y2; 5 int f; 6 int id; 7 bool operator < (const Data& obj)const 8 { 9 return x < obj.x; 10 } 11 }line[10],white[2];先扫描竖直边;
将这 3 个矩形的左右边分别存入上述数据结构中;
并保存 矩形1 的左右边;
1 int num=0; 2 for(int i=1;i <= 3;++i) 3 { 4 int x1,y1; 5 int x2,y2; 6 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 7 8 if(i == 1) 9 { 10 white[0]={x1,y1,y2,1,i};///f=1表示该边为当前矩形的左边,f=-1表示该边为当前矩形的右边 11 white[1]={x2,y1,y2,-1,i};///保存矩阵1的两个竖直边 12 } 13 line[++num]={x1,y1,y2,1,i};///保存矩阵的竖直边 14 line[++num]={x2,y1,y2,-1,i}; 15 }保存好边的信息后,按照 x 升序排列;
接下来就是判断 矩形1 的竖直边是否被 矩形2,3 完全覆盖;
但是,仅仅判断竖直边是否被完全覆盖是不够的,还需要扫描水平边;
原因的话,可以模拟一下如下样例:
0 0 4 4 0 0 4 2 0 3 4 4这样的话,就得需要保存矩形的上下边,并再次扫描一遍;
只有当 矩形1 的竖直边和水平边都分别被 矩形2,3 完全覆盖时,才能说明 矩形1 被 矩形2,3 完全覆盖;
•Code
•Wa过的样例
10 10 11 11 10 10 11 11 10 10 11 11此样例很明确的说明了 Code 中第 49~50 行的判断语句的放置位置以及如何确定判断条件;
还有一个就是上述题解中的样例,明确的说明了为什么要扫描两次;