小S和小D两个小雪参,在玩一个关于矩形的游戏以帮助他们学会怎么计算矩形的面积然后完成作业去打游戏(两个小雪参一起打游戏你怕不怕!)。他们约定每个人给出两个坐标,分别是两个矩形的左下角和右上角的坐标,他们的游戏规则很简单,就是看谁先找出来这两个矩形的覆盖的总面积大小。你的问题就是帮助他们给出正确答案。
输入的第一行为一个整数T,代表样例的组数。
每组样例包含4个坐标(x,y),( -100000000<= x,y <= 100000000 )前两个是小S给出的矩形左下角和右上角的坐标,后面两个是小D给出来的坐标。
输出两个矩形覆盖的总面积大小。
16
4
19
解题思路:这道题题意有些不明确,为什么这么说了,因为看了很多ac了的代码,它们都只能计算当两矩形没有重叠部分或重叠部分为矩形形状的情况,当重叠部分为三角形形时就错了。按照不考虑除矩形以外的形状,我是这样写的:当矩形有重叠部分时,运用最小中的最大,最大中的最小的原则。即比较两个矩形左下角坐标,取出最大的x和最大的y,组成新坐标,记为(xa,ya),比较它们右上角坐标,取出最小的x和最小的y,组成新坐标,记为(xb,yb)。这两个坐标就是重叠的矩形的左下坐标和右上坐标。具体证明,画图就行了。至于相离的情况,两个矩形面积相加就行了(然而我在判断相离的情况中WA了一次)
代码如下:
#include<stdio.h> #include<cmath> int main(){ int t; double s,x1,y1,x2,y2,x3,y3,x4,y4,s1,s2,xa,ya,xb,yb,d,dx1,dy1,dx2,dy2; scanf("%d",&t); while(t--){ scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);//左下,右上 xa=x1>x3?x1:x3; ya=y1>y3?y1:y3; xb=x2<x4?x2:x4; yb=y2<y4?y2:y4; if(x3>=x2||x1>=x4||y1>=y4||y3>=y2){ s=(x2-x1)*(y2-y1)+(x4-x3)*(y4-y3); } else{ s=(x2-x1)*(y2-y1)+(x4-x3)*(y4-y3)-(xb-xa)*(yb-ya); } printf("%.0lf\n",s); } return 0; }
再附上另一种也不错思维的代码:
#include<stdio.h> #include<string.h> #include<algorithm> #define ll double using namespace std; int main() { int t; double x1,y1,x2,y2,x3,y3,x4,y4; double x[5]; double y[5]; double sum,num; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); x[1]=x1;x[2]=x2;x[3]=x3;x[4]=x4; y[1]=y1;y[2]=y2;y[3]=y3;y[4]=y4; sort(x+1,x+5); sort(y+1,y+5); sum=(y2-y1)*(x2-x1)+(y4-y3)*(x4-x3); int l=(x2-x1)+(x4-x3)-(x[4]-x[1]); int h=(y2-y1)+(y4-y3)-(y[4]-y[1]); num=h*l; if(l<=0||h<=0) printf("%.0lf\n",sum); else { printf("%.0lf\n",sum-num); } } return 0; }