Description
题目的大致意思是在平面上给出两个矩形左上角的坐标、长度和宽度,求出重叠部分的面积。【注意:此处定义与X轴平行的那组边为长边,与Y轴平行的那组边为宽边】
Input
单组输入。
第1行输入四个整数,分别表示蓝色长方形透明卡片的左上角坐标(X坐标和Y坐标)、长和宽。两两之间用英文空格隔开。
第2行输入四个整数,分别表示黄色长方形透明卡片的左上角坐标(X坐标和Y坐标)、长和宽。两两之间用英文空格隔开。
两张长方形透明卡片的X坐标和Y坐标的取值范围为[-1000, 1000],长和宽的取值范围为[1,200]。
Output
输出一个非负整数,表示两张卡片叠加后所形成的绿色区域的面积。
Sample Input
0 100 200 100
100 150 75 75
Sample Output
1875
Analysis
两种方法都是模拟,思路不同
注意题目中已经说明与X轴平行的那组边为长边,与Y轴平行的那组边为宽边
因为输入的坐标有可能存在负数,所以不能通过二维数组标记的方式模拟
Code
- 方法一:根据两个矩形的最高和最低水平线、最左和最右竖直线的相对位置来判断重叠的情形
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
int top,bottom,left,right;
}e[2];
int fun(node e1,node e2){
if(e1.bottom>=e2.top||e1.top<=e2.bottom) return 0;
if(e1.right<=e2.left||e1.left>=e2.right) return 0;
int a=min(e1.right,e2.right)-max(e1.left,e2.left);
int b=min(e1.top,e2.top)-max(e1.bottom,e2.bottom);
return a*b;
}
int main(){
int x,y,a,b;
for(int i=0;i<2;i++){
scanf("%d%d%d%d",&x,&y,&a,&b);
e[i].top=y;
e[i].left=x;
e[i].bottom=y-b;
e[i].right=x+a;
}
printf("%d\n",fun(e[1],e[0]));
return 0;
}
- 方式二:求得dx,dy,再由(x,y)和(xx,yy)的相对位置来计算重叠矩形长度和宽度
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int x,y,xx,yy,a,b,aa,bb;
scanf("%d%d%d%d",&x,&y,&a,&b);
scanf("%d%d%d%d",&xx,&yy,&aa,&bb);
int i,j,dx,dy;
dx=abs(x-xx);
dy=abs(y-yy);
if(x<=xx)
i=min(a-dx,aa);
else
i=min(aa-dx,a);
if(y>=yy)
j=min(b-dy,bb);
else
j=min(bb-dy,b);
if(i<0||j<0) puts("0");
else printf("%d\n",i*j);
return 0;
}