1816: 矩形
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 103 Solved: 32
Submit Status Web 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 20 0 1 1 0 0 2 2-2 -2 2 2 1 -3 3 -1
Sample Output
16419
HINT
Source
思路:
就是计算两个矩形的面积,然后将这两个矩形的重叠面积减去就行了!
在计算重叠面积的时候,要判断这两个矩形是否相离,如果相离,那么就直接输出这两个矩形的和,否则,就将重叠面积减去!
在计算重叠面积的时候,要用最大的坐标中的最小的减去最小的当中的最大的然后做乘积就行了!在判断相离的时候也是用最大的坐标的最小值如果比最小的当中的最大的还要大那么就相离,否则相交!(wa了无数遍)
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
typedef long long ll;
using namespace std;
ll x1,x2,y1,y2,x3,x4,y3,y4;
ll ab(ll x)
{
if(x<0)
return -x;
return x;
}
ll min(ll x,ll y)
{
if(x<y)
{
return x;
}
return y;
}
ll max(ll x,ll y)
{
return x>y?x:y;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
ll s,t=0;
t=ab((x1-x2)*(y1-y2));
t+=ab((x3-x4)*(y3-y4));
s=ab(t);
ll sum=0;
ll minx=max(x1,x3),miny=max(y1,y3),maxx=min(x2,x4),maxy=min(y2,y4);
if(maxx<minx||maxy<miny)//最小的中的最大的还比最大的中的最小的要小就相离,否则相交
{//要判断是否相离,如果相离直接输出两个矩形面积的和
printf("%lld\n",s);
}
else//如果相交的话,就将其重叠的面积减去就OK了!
{
sum=(maxx-minx)*(maxy-miny);
printf("%lld\n",s-sum);
}
}
return 0;
}