东华oj-挑战题第8题-矩形面积交

在这里插入图片描述
8 矩形面积交

作者: Turbo时间限制: 1S章节: 基本练习

问题描述 :

平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。

输入说明 :

输入仅包含两行,每行描述一个矩形。
  在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。

输出说明 :

输出仅包含一个实数,为交的面积,保留到小数后两位。

输入范例 :
1 1 3 3
2 2 4 4

输出范例 :
1.00

代码:

/*
	T8 矩形面积交 
	算法概述:判断第二个矩形有没有点a在第一个矩形范围内(某个点a的横坐标大于
	第一个矩形横坐标较小的点小于横坐标较大的点,并且a的纵坐标同样满足要求,那么
	点a在第一个矩形范围内),若有,则求出相交范围的长和宽即可(长:第一个矩形横
	坐标的较大者减去a点的横坐标;宽:按照求长同样的方法求得) 
*/

#include<stdio.h>
#include<math.h>

void swap(double *a, double *b); 

int main() {
	int flag = 0;// 标记两矩形有无交点
	double area = 0;// 相交的面积 
	double area1 = 0, area2 = 0;
	double x = 0, y = 0;// 在第一个矩形内部的点 
	double x11 = 0, y11 = 0, x12 = 0, y12 = 0;// 第一个矩形 
	double x21 = 0, y21 = 0, x22 = 0, y22 = 0;// 第二个矩形 
	
	scanf("%lf%lf%lf%lf", &x11, &y11, &x12, &y12); 
	scanf("%lf%lf%lf%lf", &x21, &y21, &x22, &y22); 

	// 统一处理成给定的点一个在左下,一个在右上的方式 
	if (x11 > x12) 
		swap(&x11, &x12);
	if (y11 > y12) 
		swap(&y11, &y12);
	if (x21 > x22) 
		swap(&x21, &x22);
	if (y21 > y22) 
		swap(&y21, &y22);	
		
	if (((x21 >= x11 && x21 <= x12) && (x22 >= x11 && x22 <= x12)) || 
	((x11 >= x21 && x11 <= x22) && (x12 >= x21 && x12 <= x22))) {// 特殊情况,有一个矩形在另一个矩形内部
		area1 = (x12 - x11) * (y12 - y11);
		area2 = (x22 - x21) * (y22 - y21);
		area = area1 > area2 ? area2 : area1;
		printf("%.2f", area);
		flag = 1;
		return 0;
	}
		
	if ((x21 >= x11 && x21 <= x12) &&
	(y21 >= y11 && y21 <= y12)) {
		x = x21, y = y21;
		area = (x12 - x) * (y12 - y); 
		flag = 1;
		printf("%.2f", area);
		return 0;
	}
	if ((x22 >= x11 && x22 <= x12) &&
	(y22 >= y11 && y22 <= y12)) {
		x = x22, y = y22;
		area = (x - x11) * (y - y11); 
		flag = 1; 
		printf("%.2f", area);
		return 0;	
	} 
	if ((x22 >= x11 && x22 <= x12) &&
	(y21 >= y11 && y21 <= y12)) {
		x = x22, y = y21;
		area = (x - x11) * (y12 - y); 
		flag = 1;	
		printf("%.2f", area);
		return 0;
	} 
	if ((x21 >= x11 && x21 <= x12) &&
	(y22 >= y11 && y22 <= y12)) {
		x = x21, y = y22; 
		area = (x12 - x) * (y - y11); 
		flag = 1; 
		printf("%.2f", area);
		return 0;
	}	
	
	if (!flag)
		printf("0.00");
		
	return 0;
}

// 交换两个数  
void swap(double *a, double *b) {
	double temp = *a;
	*a = *b;
	*b = temp; 
}

看了下大佬的代码,我写的太啰嗦了……
改进版:

/*
	T8 矩形面积交 
	算法概述:判断第二个矩形有没有点a在第一个矩形范围内(某个点a的横坐标大于
	第一个矩形横坐标较小的点小于横坐标较大的点,并且a的纵坐标同样满足要求,那么
	点a在第一个矩形范围内),若有,则求出相交范围的长和宽即可(长:第一个矩形横
	坐标的较大者减去a点的横坐标;宽:按照求长同样的方法求得) 
*/

#include<stdio.h>
#include<math.h>

void swap(double *a, double *b); 
double max(double a, double b);
double min(double a, double b);

int main() {
	double area = 0;// 相交的面积 
	double x11 = 0, y11 = 0, x12 = 0, y12 = 0;// 第一个矩形 
	double x21 = 0, y21 = 0, x22 = 0, y22 = 0;// 第二个矩形 
	double x1 = 0, y1 = 0, x2 = 0, y2 = 0;// 相交矩形的两个点 
	
	scanf("%lf%lf%lf%lf", &x11, &y11, &x12, &y12); 
	scanf("%lf%lf%lf%lf", &x21, &y21, &x22, &y22); 

	// 统一处理成给定的点一个在左下,一个在右上的方式 
	if (x11 > x12) 
		swap(&x11, &x12);
	if (y11 > y12) 
		swap(&y11, &y12);
	if (x21 > x22) 
		swap(&x21, &x22);
	if (y21 > y22) 
		swap(&y21, &y22);	
		
	// 将四种相交情况处理成一种,记录相交矩形的左下角和右上角的坐标
	x1 = max(x11, x21);
	x2 = min(x12, x22);
	y1 = max(y11, y21);
	y2 = min(y12, y22);
	
	if (x1 > x2 || y1 > y2)// 不相交
		area = 0;
	else {
		area = (x2 - x1) * (y2 - y1);
	}
	printf("%.2f", area);
		
	return 0;
}

// 交换两个数  
void swap(double *a, double *b) {
	double temp = *a;
	*a = *b;
	*b = temp; 
} 

double max(double a, double b) {
	return a > b ? a : b;
}

double min(double a, double b) {
	return a < b ? a : b;
}

从这个题我学到了:

  1. 多种情况之间可以相互转化的时候,一般可以整合成一种情况
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值