XTU Oj 1178 Rectangle 和 1263 矩形面积的并

本文介绍了两种方法判断两个平行于坐标轴的矩形是否相交,并给出了计算矩形面积并的算法。方法一是通过比较对角线坐标找出相交矩形的边界,方法二是通过计算矩形中心点距离与边长的关系。同时,文章还提供了样例输入和输出,帮助理解算法的实现。对于矩形面积并的问题,只需在相交的情况下从总面积中减去相交部分面积即可。
摘要由CSDN通过智能技术生成

Description

题目描述

给你两个平行于坐标轴的矩形,请判断两者是不是相交(面积有重合的部分)?

输入

第一行是一个整数K,表示样例数。 每个样例占两行,每行是4个整数,表示一个矩形的对角线点的坐标,坐标值为0到1,000之间。

输出

每个样例输出一个结果,相交输出Yes,否则输出No。

样例输入

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

样例输出

No
Yes

思路:

方法一:

分别找到2个矩形右下角的坐标中最小的x(minx)和最小的y(miny),再找到2个矩形左上角坐标中最大的x(maxx)和最大的y(maxy)。最后,相交的矩形即对角线[minx,miny]--[maxx,maxy]所构成的矩形,示例图如下(参考来自知乎参考资料

注意:

题目中只是告诉了两个对角线的坐标,但是没有具体阐述哪一个是左下角的坐标,哪一个是右上角的坐标,因此需要先判断是左上角坐标还是右上角坐标。

左右上角判断依据:

左下角的横纵坐标一定是两个对角线坐标中横纵坐标最小的,右上角的横纵坐标一定是两个对角线坐标中横纵坐标最大的

由此:

两个矩形左下角对角线点的横坐标分别为:Min(x1, x2), Min(x3, x4)

找左下角横坐标中最大的:Max(Min(x1, x2), Min(x3, x4))

两个矩形右上角对角线点的纵坐标分别为:Max(x1, x2), Max(x3, x4)

找右上角横坐标中最小的:Min(Max(x1, x2), Max(x3, x4));

纵坐标同理

综上可得

        X1 = Max(Min(x1, x2), Min(x3, x4));//最大的左下角横坐标
		X2 = Min(Max(x1, x2), Max(x3, x4));//最小的右上角横坐标
		Y1 = Max(Min(y1, y2), Min(y3, y4));//最大的左下角纵坐标
		Y2 = Min(Max(y1, y2), Max(y3, y4));//最小的右上角纵坐标
        if(X1 < X2 && Y1 < Y2) //最大的左下角横坐标 < 最小的右上角横坐标
        //and 最大的左下角纵坐标 < 最小的右上角纵坐标时相交

完整代码:

#include <stdio.h>
#include<stdlib.h>
int Max(int x, int y) {
	return x > y ? x : y;
}
int Min(int x, int y) {
	return x > y ? y : x;
}
int main() { 
	int k;
	scanf("%d",&k);
	while(k--){
		int x1, y1, x2, y2, x3, y3, x4, y4;
		scanf("%d%d%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
		int X1, Y1, X2, Y2, S,s;
		X1 = Max(Min(x1, x2), Min(x3, x4));
		X2 = Min(Max(x1, x2), Max(x3, x4));
		Y1 = Max(Min(y1, y2), Min(y3, y4));
		Y2 = Min(Max(y1, y2), Max(y3, y4));
		S=abs(x2-x1)*abs(y2-y1)+abs(x4-x3)*abs(y4-y3);
		s=abs(X2-X1)*abs(Y2-Y1);
		if(X1 < X2 && Y1 < Y2)    
			printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

方法二:

 设2个矩形a,b的中心分别为oa 和ob,通过作图很容易发现 如果2个矩形要有交集必须满足2个条件:

oa ob横坐标距离<两矩形横边和/2  且 oaob纵坐标距离<两矩形纵边和/2 。

#include<stdio.h>
#include<math.h>
//设2个矩形a,b的中心分别为oa 和ob,通过作图很容易发现 如果2个矩形要有交集必须满足2个条件:
//
//oa ob横坐标距离<两矩形横边和/2  且 oaob纵坐标距离<两矩形纵边和/2 。
int main(){
    int k;
    scanf("%d",&k);
    while(k--){
        double x[5],y[5];
        for(int i=0;i<4;i++){
            scanf("%lf %lf",&x[i],&y[i]);
        }
        double x1,x2,y1,y2;
        x1 = (x[0] + x[1]) / 2;//矩形1的中心横坐标
        x2 = (x[2] + x[3]) / 2;//矩形2的中心横坐标
        y1 = (y[0] + y[1]) / 2;//矩形1的中心纵坐标
        y2 = (y[2] + y[3]) / 2;//矩形2的中心纵坐标
        double disX = abs(x[0] - x[1]) + abs(x[2] - x[3]);//两个矩形长之和
        double disY = abs(y[0] - y[1]) + abs(y[2] - y[3]);//两个矩形宽之和
        if(abs(x1 - x2) < disX / 2 && abs(y1 - y2) < disY / 2) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

Description

矩形面积的并

题目描述

给两个边平行于坐标轴的矩形,求两个矩形的面积并。

输入

存在多个样例,每个样例包括2行,每行是一个矩形,为矩形一个对角线端点的坐标x1,y1,x2,y2,0≤x1,y1,x2,y2≤1000。

输出

每行输出一个样例的结果。

样例输入

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

样例输出

2
7
2
3

思路:

这题是上面那题的兄弟题,只要用方法一,两个矩形的面积相加再减去相交部分的面积即可,但是注意两个矩形可能相交,也可能不相交。

#include <stdio.h>
#include<stdlib.h>
int Max(int x, int y) {
    return x > y ? x : y;
}
int Min(int x, int y) {
    return x > y ? y : x;
}
int main() {    
    int x1, y1, x2, y2, x3, y3, x4, y4;
    while(scanf("%d%d%d%d", &x1, &y1, &x2, &y2)!=EOF) 
    {
        scanf("%d%d%d%d", &x3, &y3, &x4, &y4);
        int X1, Y1, X2, Y2, S,s;
        X1 = Max(Min(x1, x2), Min(x3, x4));
        X2 = Min(Max(x1, x2), Max(x3, x4));
        Y1 = Max(Min(y1, y2), Min(y3, y4));
        Y2 = Min(Max(y1, y2), Max(y3, y4));
        S=abs(x2-x1)*abs(y2-y1)+abs(x4-x3)*abs(y4-y3);
        s=abs(X2-X1)*abs(Y2-Y1);
        if(X1 < X2 && Y1 < Y2)    
        printf("%d\n",S-s);
        else printf("%d\n",S);
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值