杭电oj 2056

杭电oj 2056

题目

思路:
题目给一个平面直角坐标中的两个矩形,每个矩形的每条边分别平行于x轴y轴,给出两个矩形的对角的两个顶点,求出两个矩形重叠部分的面积。
根据题目意思可以列出以下几种情况:
矩形

此时最简单也最容易想到的方法是直接对着上面每种情况进行阴影部分“坐标减法”,但这种方法不仅可能容易想漏可能出现的情况,而且需要每次先判断这两个矩形是属于什么情况,再做出相应的减法操作,复杂度将大大提高。这时候就需要想有没有一种的算法是对所有情况都有用的。
1

以宽为例,两矩形的阴影部分的宽是a+b-c,长以此类推,当求出的宽和长同时大于0时,存在重合部分。经过试验,其他情况均可以用这个式子表达,代码如下:

#include <iostream>
#include <algorithm>
#include <math.h>
#include<iomanip>
using namespace std;
double a[5] = { 0 }, b[5] = { 0 };
int main()
{
    double x[5] = { 0 }, y[5] = { 0 };
    while (cin >> x[0] >> y[0] >> x[1] >> y[1] >> x[2] >> y[2] >> x[3] >> y[3])
    {
        for (int i = 0; i <= 3; i++)
        {
            a[i] = x[i];
            b[i] = y[i];
        }
        sort(a, a + 4);
        sort(b, b + 4);
        double c = fabs(x[1] - x[0]) + fabs(x[3] - x[2]) - fabs(a[3] - a[0]);
        double h= fabs(y[1] - y[0]) + fabs(y[3] - y[2]) - fabs(b[3] - b[0]);
        if (c > 0 && h > 0)
            cout << setprecision(2) << fixed<<h * c << endl;
        else
            cout << "0.00" << endl;
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。