杭电OJ2056
这道题看似简单,但挺考验代码能力以及是否考虑周全的。先写一写伪代码:
if(两个矩形有相交部分)
printf(输出相交部分面积)
else printf(0.00\n);
将第一个矩形的左下角,右上角坐标分别设为(n1,m1),(n2,m2),同样第二个设个(n3,m3),(n4,m4),由于题目所给的坐标不一定是给出左下角、右下角坐标,因此应事先进行数据处理。
下面先解决简单的——没有相交的情况:
n1>n4||m1>m4||n2<n3||m2<m3(画个图比划一下就知道)
相交情况:
设相交部分的矩形左下角,右下角坐标分别为(xl,yl),(xr,yr),画个图观察一下知,xl=max(n1,n3),yl=max(m1,m3), xr=min(n2,n4), yr=min(m2,m4);
代码如下:
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
double x1,y1,x2,y2,x3,y3,x4,y4;
double n1,m1,n2,m2,n3,m3,n4,m4;
double wl,hl,wr,hr;
double sum;
while(scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4)!=EOF){
//全部坐标统一先转换为左下角、右下角类型,便于计算香相交部分
n1 = min(x1,x2);m1=min(y1,y2);
n2 = max(x1,x2);m2=max(y1,y2);
n3 = min(x3,x4);m3=min(y3,y4);
n4 = max(x3,x4);m4=max(y3,y4);
//画图可看出条件
if(n1>n4||m1>m4||n2<n3||m2<m3)
printf("0.00\n");
else{
//求相交部分高宽
wl=max(n1,n3);wr=min(n2,n4);
hl=max(m1,m3);hr=min(m2,m4);
sum = abs(wr-wl)*abs(hr-hl);
printf("%.2lf\n",sum);
}
}
return 0;
}