题目链接:https://hpuoj.com/contest/16/problem/H/
Mo的老师给了他两个矩形,让他求两个矩形的面积并。Mo很忙没时间解决这种小case,请你帮他解决。
输入
输入两行,每行四个整数 x,y,x1,y1 。(x,y) 是矩形左下角,(x1,y1) 是矩形的右上角. (0≤x,y,x1,y1≤1000)。
输出
输出一个整数表示二个矩形的面积并。
样例
input
0 1 2 3
1 0 3 2
output
7
思路:
分别用数组来模拟矩形的边覆盖的点,然后计算出两个矩形重合部分的长和宽,即算出重合部分的面积,然后两个矩形面积相加减去重合部分
计算重合部分的长: 切记一定要标记末尾!!! 因为没有标记错了n次!!痛心啊~~~
(数组最后一位还是数字!!!!和字符串不一样,所以,要用一个负数来充当最后一位的空,以便找到刚好不重合时的位置 )
AC代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
const int N=1007;
using namespace std;
int main()
{
int x1,y1,x11,y11;
int x2,y2,x22,y22;
scanf("%d%d%d%d",&x1,&y1,&x11,&y11);
scanf("%d%d%d%d",&x2,&y2,&x22,&y22);
int a1[N],a2[N],a3[N],a4[N];
for(int i=x1;i<=x11;i++)
a1[i]=i;
for(int i=x2;i<=x22;i++)
a2[i]=i;
for(int i=y1;i<=y11;i++)
a3[i]=i;
for(int i=y2;i<=y22;i++)
a4[i]=i;
a1[x11+1]=-1,a2[x22+1]=-2,a3[y11+1]=-3,a4[y22+1]=-4;//标记结尾部分,以便于找到线段(长和宽)刚好不重合的点
int sum1=0,sum2=0,s1=0,s2=0;
//分别计算长和宽重叠部分
if(x1<=x2)
{
int flag=0;
for(int i=x1;i<=x11+1;i++)
{
if(a1[i]==a2[x2])
{
flag=1;
break;
}
}
if(flag==1)
{
for(int i=x2+1,j=x2+1;j<=x22+1;i++,j++)
{
if(a1[i]!=a2[j])//计算重合的矩形的长(因为是用数组记录矩形覆盖的
{ //长,数组最后一位还是数字!!!!和字符串不一样,所以,要用一个负数来充当最后一位的空,以便找到刚好不重合时的位置
sum1=a1[i-1];
break;
}
}
s1=x2;
}
}
else if(x2<x1)
{
int flag=0;
for(int i=x2;i<=x22+1;i++)
{
if(a2[i]==a1[x1])
{
flag=1;
break;
}
}
if(flag==1)
{
s1=x1;
for(int i=x1+1,j=x1+1;j<=x11+1;i++,j++)
{
if(a2[i]!=a1[j])
{
sum1=a1[i-1];
break;
}
}
}
}
if(y1<=y2)
{
int flag=0;
for(int i=y1;i<=y11+1;i++)
{
if(a3[i]==a4[y2])
{
flag=1;
break;
}
}
if(flag==1)
{
for(int i=y2+1,j=y2+1;j<=y22+1;i++,j++)
{
if(a3[i]!=a4[j])
{
sum2=a3[i-1];
break;
}
}
s2=y2;
}
}
else if(y2<y1)
{
int flag=0;
for(int i=y2;i<=y22+1;i++)
{
if(a4[i]==a3[y1])
{
flag=1;
break;
}
}
if(flag==1)
{
s2=y1;
for(int i=y1+1,j=y1+1;j<=y11+1;i++,j++)
{
if(a4[i]!=a3[j])
{
sum2=a3[i-1];
break;
}
}
}
}
int x;
x=abs(s1-sum1)*abs(s2-sum2);
int ans=(x11-x1)*(y11-y1)+(x22-x2)*(y22-y2)-x;
printf("%d",ans);
return 0;
}