8 矩形面積交
作者: Turbo時間限制: 1S章節: 基本練習
問題描述 :
平面上有兩個矩形,它們的邊平行於直角座標系的X軸或Y軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你編程算出兩個矩形的交的面積。
輸入說明 :
輸入僅包含兩行,每行描述一個矩形。
在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個絕對值不超過10^7的實數表示。
輸出說明 :
輸出僅包含一個實數,爲交的面積,保留到小數後兩位。
輸入範例 :
1 1 3 3
2 2 4 4
輸出範例 :
1.00
代碼:
/*
T8 矩形面積交
算法概述:判斷第二個矩形有沒有點a在第一個矩形範圍內(某個點a的橫座標大於
第一個矩形橫座標較小的點小於橫座標較大的點,並且a的縱座標同樣滿足要求,那麼
點a在第一個矩形範圍內),若有,則求出相交範圍的長和寬即可(長:第一個矩形橫
座標的較大者減去a點的橫座標;寬:按照求長同樣的方法求得)
*/
#include<stdio.h>
#include<math.h>
void swap(double *a, double *b);
int main() {
int flag = 0;// 標記兩矩形有無交點
double area = 0;// 相交的面積
double area1 = 0, area2 = 0;
double x = 0, y = 0;// 在第一個矩形內部的點
double x11 = 0, y11 = 0, x12 = 0, y12 = 0;// 第一個矩形
double x21 = 0, y21 = 0, x22 = 0, y22 = 0;// 第二個矩形
scanf("%lf%lf%lf%lf", &x11, &y11, &x12, &y12);
scanf("%lf%lf%lf%lf", &x21, &y21, &x22, &y22);
// 統一處理成給定的點一個在左下,一個在右上的方式
if (x11 > x12)
swap(&x11, &x12);
if (y11 > y12)
swap(&y11, &y12);
if (x21 > x22)
swap(&x21, &x22);
if (y21 > y22)
swap(&y21, &y22);
if (((x21 >= x11 && x21 <= x12) && (x22 >= x11 && x22 <= x12)) ||
((x11 >= x21 && x11 <= x22) && (x12 >= x21 && x12 <= x22))) {// 特殊情況,有一個矩形在另一個矩形內部
area1 = (x12 - x11) * (y12 - y11);
area2 = (x22 - x21) * (y22 - y21);
area = area1 > area2 ? area2 : area1;
printf("%.2f", area);
flag = 1;
return 0;
}
if ((x21 >= x11 && x21 <= x12) &&
(y21 >= y11 && y21 <= y12)) {
x = x21, y = y21;
area = (x12 - x) * (y12 - y);
flag = 1;
printf("%.2f", area);
return 0;
}
if ((x22 >= x11 && x22 <= x12) &&
(y22 >= y11 && y22 <= y12)) {
x = x22, y = y22;
area = (x - x11) * (y - y11);
flag = 1;
printf("%.2f", area);
return 0;
}
if ((x22 >= x11 && x22 <= x12) &&
(y21 >= y11 && y21 <= y12)) {
x = x22, y = y21;
area = (x - x11) * (y12 - y);
flag = 1;
printf("%.2f", area);
return 0;
}
if ((x21 >= x11 && x21 <= x12) &&
(y22 >= y11 && y22 <= y12)) {
x = x21, y = y22;
area = (x12 - x) * (y - y11);
flag = 1;
printf("%.2f", area);
return 0;
}
if (!flag)
printf("0.00");
return 0;
}
// 交換兩個數
void swap(double *a, double *b) {
double temp = *a;
*a = *b;
*b = temp;
}
看了下大佬的代碼,我寫的太囉嗦了……
改進版:
/*
T8 矩形面積交
算法概述:判斷第二個矩形有沒有點a在第一個矩形範圍內(某個點a的橫座標大於
第一個矩形橫座標較小的點小於橫座標較大的點,並且a的縱座標同樣滿足要求,那麼
點a在第一個矩形範圍內),若有,則求出相交範圍的長和寬即可(長:第一個矩形橫
座標的較大者減去a點的橫座標;寬:按照求長同樣的方法求得)
*/
#include<stdio.h>
#include<math.h>
void swap(double *a, double *b);
double max(double a, double b);
double min(double a, double b);
int main() {
double area = 0;// 相交的面積
double x11 = 0, y11 = 0, x12 = 0, y12 = 0;// 第一個矩形
double x21 = 0, y21 = 0, x22 = 0, y22 = 0;// 第二個矩形
double x1 = 0, y1 = 0, x2 = 0, y2 = 0;// 相交矩形的兩個點
scanf("%lf%lf%lf%lf", &x11, &y11, &x12, &y12);
scanf("%lf%lf%lf%lf", &x21, &y21, &x22, &y22);
// 統一處理成給定的點一個在左下,一個在右上的方式
if (x11 > x12)
swap(&x11, &x12);
if (y11 > y12)
swap(&y11, &y12);
if (x21 > x22)
swap(&x21, &x22);
if (y21 > y22)
swap(&y21, &y22);
// 將四種相交情況處理成一種,記錄相交矩形的左下角和右上角的座標
x1 = max(x11, x21);
x2 = min(x12, x22);
y1 = max(y11, y21);
y2 = min(y12, y22);
if (x1 > x2 || y1 > y2)// 不相交
area = 0;
else {
area = (x2 - x1) * (y2 - y1);
}
printf("%.2f", area);
return 0;
}
// 交換兩個數
void swap(double *a, double *b) {
double temp = *a;
*a = *b;
*b = temp;
}
double max(double a, double b) {
return a > b ? a : b;
}
double min(double a, double b) {
return a < b ? a : b;
}
從這個題我學到了:
- 多種情況之間可以相互轉化的時候,一般可以整合成一種情況