这道题看似简单,但挺考验代码能力以及是否考虑周全的。先写一写伪代码:
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 xl,yl,xr,yr;
double square;
while(~scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4))
{
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
{
xl=max(n1,n3);yl=max(m1,m3);
xr=min(n2,n4);yr=min(m2,m4);
square=abs(xl-xr)*abs(yl-yr);
printf("%.2lf\n",square);
}
}
return 0;
}
小结:做题之前别急,写好思路(伪代码),找准主要对象(相交矩形),最后要对自己的代码有些信心,对失败要做好心理准备,但对成功也要抱有希望。还有, 测试的时候别烦,但也别太慢了。