题目:
题目的意思大概就是给你四个坐标,来表示两个矩形。然后计算两个矩形的面积,这里都是假设两个矩形都是水平的。
解题思路: 这个问题其实可以分成一个更小的问题,就是给你一个数轴上两条线段(四个点设线段L1(x1,x2), 线段L2(y1,y2)),要你求解他们重合的长度。他们在数轴上的分布情况可以分为以下三种情况。
1、两个线段没有相交的情况,即y2≤x1或者y1≥x2
2、某条线段在另外一条线段的内部,即(y1≥x1&&y2≤x2)||(x1≥y1&&x2≤y2)
3、两条线段部分相交,即(y1≤x1&&y2≥x1&&y2≤x2)||(y1≥x1&&y1≤x2&&y2≥x2)
根据这样的两种情况,就可以把重合部分矩形的长和宽计算出来。就可以做出来了,代码如下。
int dealt(int x1,int x2,int y1,int y2)
{
if(y1>=x2||y2<=x1)
return 0;
if(x1<=y1&&y2<=x2)
return y2-y1;
if(y1<=x1&&x2<=y2)
return x2-x1;
if(y1<=x1&&y2>=x1&&y2<=x2)
return y2-x1;
if(y1>=x1&&y1<=x2&&y2>=x2)
return x2-y1;
}
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H)
{
return (C-A)*(D-B)+(G-E)*(H-F)-dealt(A,C,E,G)*dealt(B,D,F,H);
}
在求解这种重合的情况,当线段相对比较多的时候,就不应该使用这种分类讨论的情况,先对其排序再求解,具体可以参考soj上的“校园里的树”一题。这里也可以使用排序的方法,代码如下。
int computeArea(int A, int B, int C, int D, int E, int F, int G, int H)
{
int ans=(D-B)*(C-A)+(G-E)*(H-F);
if(E>=C||G<=A||F>=D||H<=B)
return ans;
else
{
vector<int> x;
x.push_back(A);
x.push_back(C);
x.push_back(E);
x.push_back(G);
vector<int> y;
y.push_back(B);
y.push_back(D);
y.push_back(F);
y.push_back(H);
sort(x.begin(),x.end());
sort(y.begin(),y.end());
return ans-((x[2]-x[1])*(y[2]-y[1]));
}
return ans;
}
总结: 虽然说排序是一种更为科学的方法,但是在这里它只有两条线段,使用排序还要开两个vector还要排序,那空间和时间复杂度是不是相对而言比较高一点?