首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDU 2056 Rectangles:兩矩形相交面積計算全解析

     編輯:關於C++

問題描述

給定兩個邊平行於坐標軸的矩形,各自通過對角線上的兩點座標確定。輸入為 8 個數字:x1, y1, x2, y2 (第一個矩形),x3, y3, x4, y4 (第二個矩形)。要求計算兩矩形相交部分的面積,精確到小數點後兩位。若不相交或僅邊界接觸,面積為 0。

幾何核心邏輯

矩形相交區域同樣是矩形(或退化為線段/點)。其左下角座標為兩矩形左下角的最大值,右上角座標為兩矩形右上角的最小值:

  • 相交區域左邊界:max(x1, x3)
  • 相交區域下邊界:max(y1, y3)
  • 相交區域右邊界:min(x2, x4)
  • 相交區域上邊界:min(y2, y4)

若左邊界 ≥ 右邊界或下邊界 ≥ 上邊界,則無有效相交區域,面積為 0。

座標預處理

輸入的對角線兩點順序不固定,需先標準化:確保 x1 ≤ x2, y1 ≤ y2 (同理第二矩形),即將較小值作為左下角,較大值作為右上角。

完整參考代碼 (C++)

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;

int main() {
    double x1, y1, x2, y2, x3, y3, x4, y4;
    while (cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4) {
        // 標準化座標:確保 (x1,y1) 為左下,(x2,y2) 為右上
        if (x1 > x2) swap(x1, x2);
        if (y1 > y2) swap(y1, y2);
        if (x3 > x4) swap(x3, x4);
        if (y3 > y4) swap(y3, y4);

        // 計算相交區域邊界
        double left   = max(x1, x3);
        double bottom = max(y1, y3);
        double right  = min(x2, x4);
        double top    = min(y2, y4);

        // 判斷是否相交並計算面積
        double area = 0.0;
        if (left < right && bottom < top) {
            area = (right - left) * (top - bottom);
        }

        cout << fixed << setprecision(2) << area << endl;
    }
    return 0;
}

測試樣例

輸入:
1.00 1.00 3.00 3.00 2.00 2.00 4.00 4.00
5.00 5.00 13.00 13.00 4.00 4.00 12.50 12.50

輸出:
1.00
56.25

易錯點提醒

  1. 座標順序不固定,必須先排序標準化。
  2. 邊界重合(面積為 0)需正確判斷,嚴格不等式 < 而非 ≤。
  3. 輸出格式固定兩位小數,使用 fixed << setprecision(2)。
  4. 多測試用例輸入,以 EOF 結束。

此題考察基本幾何邏輯與邊界處理,代碼簡潔高效,是計算幾何入門的經典練習。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved