題目要求:求兩個長方形的總面積(長方形長和x周平行,寬和y軸平行)
tags:math
思路:求重合邊的長度,然後求得重合面積。總面積爲兩個長方形的面積和減去重合面積。
我的代碼:
情況1:如果長方形有一對邊是分離的,則兩個長方形不相交
情況2:如果長方形有一對邊是包含的,則短邊乘以另一對邊相交長度,則爲重合面積
情況3:兩對邊都是包含一部分,則重合面積爲兩邊相交長度乘機
由上分析可得,3種情況可以合併成爲計算每對邊交合長度來計算其重合面積。
public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
int mutualACEG = 0;
if(A>E){//E在A左邊
if(A>G){//G在A左邊
mutualACEG = 0;
}else if(A<=G&&C>=G){//G在AC中間
mutualACEG = G-A;
}else{//G在C左邊
mutualACEG = C-A;
}
}else if(A<=E&&C>=E){//E在AC中間
if(A<=G&&C>=G){//G在AC中間
mutualACEG = G-E;
}else{//G在C右邊
mutualACEG = C-E;
}
}else{//E在C右邊
mutualACEG = 0;
}
int mutualBDFH = 0;
if(B>F){//F在B下邊
if(B>H){//H在B下邊
mutualBDFH = 0;
}else if(B<=H&&D>=H){//H在BD中間
mutualBDFH = H-B;
}else{//H在D上邊
mutualBDFH = D-B;
}
}else if(B<=F&&D>=F){//F在BD中間
if(B<=H&&D>=H){//H在BD中間
mutualBDFH = H-F;
}else{//H在D上邊
mutualBDFH = D-F;
}
}else{//F在D上邊
mutualBDFH = 0;
}
return (C-A)*(D-B)+(G-E)*(H-F)-mutualACEG*mutualBDFH;
}
//別人的思路,只需要知道小的點的最大點,和大的點的最小點,即可獲得共同長度
//由於兩個長方形不分先後,所以可以通過比大小來操作
public int computeArea2(int A, int B, int C, int D, int E, int F, int G, int H) {
int left = Math.max(A,C);
int right = Math.max(Math.min(C, G),left);
int bottom = Math.max(B, F);
int top = Math.max(Math.min(D,H), bottom);
return (C-A)*(D-B)+(G-E)*(H-F)-(right-left)*(top-bottom);
}