1. 程式人生 > >【藍橋杯】基礎練習 矩形面積交

【藍橋杯】基礎練習 矩形面積交

問題描述
  平面上有兩個矩形,它們的邊平行於直角座標系的X軸或Y軸。對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。

輸入格式
  輸入僅包含兩行,每行描述一個矩形。
  在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個絕對值不超過10^7的實數表示。

輸出格式
  輸出僅包含一個實數,為交的面積,保留到小數後兩位。

樣例輸入
1 1 3 3
2 2 4 4

樣例輸出
1.00

很基礎的題目,可是我腦子笨想了好久,摳腳大漢嚶嚶嚶~~~~~

看題目應該是為後面線段樹+掃描線的題型打基礎吧嚶嚶嚶~~~~

思路:(1)首先判斷矩形A和B是否相離
思考了很久才想到,證明自己也是挺蠢的哈哈哈

找到矩形A中X座標較大的,再找到矩形B中X座標較大的,在得到的兩個數中取較小的賦值給a;

找到矩形A中X座標較小的,再找到矩形B中X座標較小的,在得到的兩個數中取較大的賦值給b;

找到矩形A中Y座標較大的,再找到矩形B中Y座標較大的,在得到的兩個數中取較小的賦值給c;

找到矩形A中Y座標較小的,再找到矩形B中Y座標較小的,在得到的兩個數中取較大的賦值給d;

若(a - b > 0 && c - d > 0)滿足,則說明兩個矩形相交或內含;

大家可以隨便畫一個相交的圖體會一下嚶嚶嚶~~~

       (2)矩形的重合面積S=(a - b) * (c - d);

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		double x1 = sc.nextDouble();
		double y1 = sc.nextDouble();
		double x2 = sc.nextDouble();
		double y2 = sc.nextDouble();
		double x3 = sc.nextDouble();
		double y3 = sc.nextDouble();
		double x4 = sc.nextDouble();
		double y4 = sc.nextDouble();
		double a = Math.min(Math.max(x1, x2), Math.max(x3, x4));// 兩個矩形中分別最大X座標中的最小值
		double b = Math.max(Math.min(x1, x2), Math.min(x3, x4));// 兩個矩形中分別最小X座標中的最大值
		double c = Math.min(Math.max(y1, y2), Math.max(y3, y4));// 兩個矩形中分別最大Y座標中的最小值
		double d = Math.max(Math.min(y1, y2), Math.min(y3, y4));// 兩個矩形中分別最小Y座標中的最大值
		if (a - b > 0 && c - d > 0) {// 說明兩個矩形相交或內含
			System.out.printf("%.2f", (a - b) * (c - d));
		} else
			System.out.println("0.00");
	}
}