代码改变世界

[笔试题]求两矩形的无重叠的面积之和

2013-10-07 22:39  ripny  阅读(251)  评论(0)    收藏  举报

 

 

 

解题思路:

(1)关键是判断矩形的包含关系,故首先找出大矩形和小矩形;由于两种情况解法一样,故可以采用递归调用的方式,交换参数即可;

(2)矩形就4个端点,通过判断端点是否在另外一个矩形区域内,可以分情况讨论;

(3)分A(左上)、B(右上)、C(左下)、D(右下)四个端点讨论;

当A属于另一矩形时,返回的值和B、C的情况有关;

若A不属于另一矩形,当B属于另一矩形时,返回的值和C的情况有关;

若A/B当不属于另一矩形,当C属于另一矩形时,返回的值和D的情况有关;

只有D属于另一矩形;

ABCD都不属于另一矩形;

 

function solution($K, $L, $M, $N, $P, $Q, $R, $S) {

         $s1 = ($M-$K)*($N-$L);

         $s2 = ($R-$P)*($S-$Q);

        

         if($s1>$s2){

                   $A = checkPoint($K, $L, $M, $N, $P, $S);  // A--B

                   $B = checkPoint($K, $L, $M, $N, $R, $S);  // |  |         

                   $C = checkPoint($K, $L, $M, $N, $P, $Q);  // C--D

                   $D = checkPoint($K, $L, $M, $N, $R, $Q);

                   if($A)return $s1+$s2-(($B ? $R : $M)-$P)*($S-($C ? $Q : $L));

                   if($B)return $s1+$s2-($R-$K)*($S-($C ? $Q : $L));

                   if($C)return $s1+$s2-(($D ? $R : $M)-$P)*($N-$Q);

                   if($D)return $s1+$s2-($R-$K)*($N-$Q);

                   return $s1+$s2;

         }

         else{

                   return solution($P, $Q, $R, $S, $K, $L, $M, $N);

         }

        

}

 

function checkPoint($K, $L, $M, $N, $X, $Y){

         return ($X>$K && $X<$M && $Y>$L && $Y<$N);

}