zzuli 1816: 矩形 排序思维

1816: 矩形

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 179  Solved: 54

SubmitStatusWeb Board

Description

小S和小D两个小雪参,在玩一个关于矩形的游戏以帮助他们学会怎么计算矩形的面积然后完成作业去打游戏(两个小雪参一起打游戏你怕不怕!)。他们约定每个人给出两个坐标,分别是两个矩形的左下角和右上角的坐标,他们的游戏规则很简单,就是看谁先找出来这两个矩形的覆盖的总面积大小。你的问题就是帮助他们给出正确答案。

Input

输入的第一行为一个整数T,代表样例的组数。

每组样例包含4个坐标(x,y),( -100000000<= x,y <= 100000000 )前两个是小S给出的矩形左下角和右上角的坐标,后面两个是小D给出来的坐标。

Output

输出两个矩形覆盖的总面积大小。

Sample Input

3
-2 -2 2 2 -2 -2 2 2
0 0 1 1 0 0 2 2
-2 -2 2 2 1 -3 3 -1

Sample Output

16
4
19
代码:
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxn=5;
struct node {
    double num;
    int flag;
}ansx[maxn],ansy[maxn];
bool cmp(const node &a, const node &b) {
    return a.num<b.num;
}
int main() {
    int t;
    scanf("%d",&t);
    while(t--) {
        double x,y;
        for(int i=0;i<4;++i) {
            scanf("%lf%lf",&x,&y);
            ansx[i].num=x;ansy[i].num=y;
            if(i<=1) {
                ansx[i].flag=-1;ansy[i].flag=-1;
            } else {
                ansx[i].flag=1;ansy[i].flag=1;
            }
        }
        double area=0;
        area+=fabs(ansx[1].num-ansx[0].num)*fabs(ansy[1].num-ansy[0].num);
        area+=fabs(ansx[3].num-ansx[2].num)*fabs(ansy[3].num-ansy[2].num);
        sort(ansx,ansx+4,cmp);
        sort(ansy,ansy+4,cmp);
        double darea=0;
        if(ansx[0].flag+ansx[1].flag==0&&ansy[0].flag+ansy[1].flag==0) {
            double dx=fabs(ansx[1].num-ansx[2].num);
            double dy=fabs(ansy[1].num-ansy[2].num);
            darea=dx*dy;
        }
        area-=darea;
        printf("%.0lf\n",area);
    }
    return 0;
}


posted @ 2017-11-03 01:43  lemonsbiscuit  阅读(137)  评论(0)    收藏  举报