Problem H: 不要方——桌面窗体重叠面积

这题就是简单的求交集问题,在另一个oj上有类似的题,几个月前AC了,今天被这个题目搞自闭了,WA了6次,我太菜了,最后发现是少加了个 等于号 害 还是太菜了。

本题有优化版本和未优化版本

Description

现在有两个矩形,请算出它们公共面积的大小。

Input

多组测试数据。
每组输入形如:
x1 y1 x2 y2
x3 y3 x4 y4

(x1,y1)为第一个矩形的左上角的坐标,(x2,y2)位第一个矩形右下角的坐标。
(x3,y3)为第二个矩形的左上角的坐标,(x4,y4)位第二个矩形右下角的坐标。
所有数据的绝对值小于等于100,且均是整数。

Output

请输出对应的答案。

Sample Input

1 4 2 1
0 3 3 2
0 2 1 1
3 4 4 3
0 2 3 1
2 3 4 0

Sample Output

1
0
1

代码实现

#include
using namespace std;
int main()
{
     
    int x1,y1,x2,y2,x3,y3,x4,y4;
    while(cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4)
    {
     
        int tall=0,lenth=0,s=0;
		if(x1>=x3 && x4>=x1 && x4<=x2)
			lenth=x4-x1;
        else if(x1>=x3 && x4>=x2)
			lenth=x2-x1;
		else if(x1<=x3 && x4<=x2)
			lenth=x4-x3;
		else if(x3<=x2 && x2<=x4 && x3>=x1)
			lenth=x2-x3;
		if(y3>=y1 && y1>=y4 && y4>=y2)
			tall=y1-y4;
        else if(y3>=y1 && y4<=y2)
			tall=y1-y2;
		else if(y1>=y3 && y4>=y2)
			tall=y3-y4;
		else if(y3>=y2 && y2>=y4 && y3<=y1)
			tall=y3-y2;
		s=lenth * tall;
		if(y2>y3 || y4>y1 || x1>x4 || x3>x2)
			s=0;
		printf("%d\n",s);
    }
    return 0;
}

自闭之余 看了一个gg的代码
上面的x和y实际上是需要实现一样的结果 所以进行优化

#include 
using namespace std;
int calc(int x1, int x2, int x3, int x4)
{
     
    if (x1 >= x3 && x2 <= x4)
        return x2 - x1;
    if (x2 >= x4 && x1 <= x3)
        return x4 - x3;
    if (x3 >= x1 && x2 <= x4 && x3 <= x2)
        return x2 - x3;
    if (x1 >= x3 && x4 <= x2 && x1 <= x4)
        return x4 - x1;
    return 0;
}
int main()
{
     
    int x1, y1, x2, y2,x3, y3, x4, y4;
    while (cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4)
        cout<<calc(x1, x2, x3, x4) * calc(-y1, -y2, -y3, -y4) << endl;
}

你可能感兴趣的:(#,ZSTUOJ)