東華oj-挑戰題第8題-矩形面積交

在這裏插入圖片描述
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;
}

從這個題我學到了:

  1. 多種情況之間可以相互轉化的時候,一般可以整合成一種情況
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章