您的位置:首页 > 其它

南邮 OJ 1484 烧饼重叠问题

2015-08-06 08:32 363 查看


烧饼重叠问题

时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte

总提交 : 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");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: