烧饼重叠问题
总提交 : 87 测试通过 : 12
比赛描述
南邮三牌楼食堂继推出“佳逗”牌葱花大饼后,为庆祝2010级本科生、研究生入学,又推出“珍逗”牌芝麻烧饼,这种烧饼规则正四边形形状,大小各异。在制作烧饼时,首先要准备面粉、水、食用油、食盐等原料,然后将这些原料混合揉成面团,在面板上擀成规则正四边形的面片、面皮,用面皮把面卷包好,成为烧饼胚。最后铺芝麻,平底锅铺油,用中火或小火两面烙饼,直到两面金黄为止。
食堂师傅在制作烧饼过程中,多个烧饼胚同时放在平底锅(规则正四边形)上进行烤烙,有时烧饼胚摆放不好就会粘在一起。他们请你编程分析烧饼胚边界,判断这些烧饼是否重叠(最终会粘在一起)。为使问题简化,假设平底锅在一个平面上,分成若干单元块,每个单元块标有两个方向的坐标,其位置用左下角单元的坐标和右上角单元的坐标表示,(0,0)表示平底锅最左下角单元,如图1所示。请注意,如果一个烧饼包含另一个烧饼的一部分,则认为两个烧饼重叠;只有相邻的边或点,两个烧饼不重叠。
输入
输入首先给出同时烤烙的烧饼胚数量C,接着给出C个烧饼位置。
每一个烧饼位置用1行表示,格式为x1 y1 x2 y2,其中(x1,y1)表示烧饼左下角位置,(x2,y2) 表示烧饼右上角位置。
1≤C≤10,0≤x1, y1, x2, y2≤19。
输出
如果同时烤烙的烧饼有重叠,则输出Overlap;没有重叠,则输出No Overlap。
样例输入
3
1 1 2 2
2 5 4 7
4 2 7 3
2
1 1 2 2
2 2 5 3
样例输出
No Overlap
Overlap
题目来源
2010华为杯南邮校园程序设计大赛
/* Wrong Answer at Test 2
#include<iostream>
#include<set>
using namespace std;
struct line{
int x1,x2,y;
bool isUp;
};
bool operator<(const line &l1, const line &l2){
if(l1.y != l2.y){
return l1.y < l2.y;
}
return l1.isUp > l2.isUp; // 是下边缘的话 排在前面
}
int main(){
int C,x1,y1,x2,y2,count;
line l;
bool overlap;
set<int> xs;
multiset<line> ls;
set<int>::iterator it1,it2;
multiset<line>::iterator it;
while(scanf("%d",&C)==1){
xs.clear();
ls.clear();
while(C--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
xs.insert(x1);
xs.insert(x2);
l.x1 = x1;
l.x2 = x2;
l.y = y1;
l.isUp = 0;
ls.insert(l);
l.y = y2;
l.isUp = 1;
ls.insert(l);
}
overlap = 0;
it1=it2=xs.begin();
it2++;
while(!overlap && it2!=xs.end() ){
count = 0;
for(it=ls.begin(); !overlap && it!=ls.end(); ++it){
if(it->x1 <= *it1 && it->x2 >= *it2){
if(it->isUp){
--count;
}else{
if(++count>1){
overlap = 1;
break;
}
}
}
}
++it1;
++it2;
}
if(overlap){
printf("Overlap\n");
}else{
printf("No Overlap\n");
}
}
}
*/
#include<iostream>
#include<set>
#define MAX_N 20
using namespace std;
int a[MAX_N][MAX_N];
int main(){
int C,x1,x2,y1,y2,i,j;
bool overlap;
while(scanf("%d",&C)==1){
overlap = 0;
memset(a,0,sizeof(a));
while(C--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(!overlap){
for(i=x1;!overlap && i<=x2;i++){
for(j=y1;!overlap && j<=y2;j++){
if(++a[i][j]>1){
overlap = 1;
break;
}
}
}
}
}
if(overlap){
printf("Overlap\n");
}else{
printf("No Overlap\n");
}
}
}