解题报告+优化——试题 基础练习 矩形面积交——16行代码AC

励志用少的代码做高效的表达。


心路历程:

第一阶段:

最初想独立AC出这题来着,但考虑来考虑去,总觉得没想到点子上,缺点什么似的。于是搜网,果不其然,是一种全新的算法“线段交”。当然这是简化版的。 下面说一下判断线段交的方法;
线段交:
先判断两个矩形是否相交,如果不相交直接输出0。反之,则输出4个横坐标中中间两个横坐标值之差, 4个纵坐标中中间两个纵坐标值之差。(好有道理啊有木有)

好大一坨知识!学习了!

第二阶段:

明确思路后,对题的重心就从解出变成了优化。 最开始定义了八个变量,分别表示(x1,y1)、(x2,y2)、(xi,yi)、(xj,yj),但后来发现这样判断大小太麻烦,索性将所有值存入数组,用algorithm中sort对数组进行排序操作,十分方便、整洁。
传送门→懒癌的福音——algorithm头文件函数全集。

注意点:

1、别忘了计算范围是实数,最开始搞成了整数,看测试用例时才发现。
2、输入时第一个坐标可能是矩形四个点中任意一点,第二个坐标是其对角线。也就是说,需要排序或判断后,将小的值放在前面,再去运算
3、第九行代码的意思是:若矩形1中x坐标最小值大于等于矩形2中x坐标最大值 或 矩形1中x坐标最大值小于等于矩形2中x坐标最小值…

代码:

#include
using namespace std;
double x[4], y[4];
int main() {
    for(int  i = 0; i < 4; i += 2)
        cin >> x[i] >> y[i] >> x[i+1] >> y[i+ 1];
    sort(x, x+2);  sort(x+2, x+4);
    sort(y, y+2);  sort(y+2, y+4);
    if(x[0] >= x[3] || x[1] <= x[2] || y[0] >= y[3] || y[1] <= y[2]){
        printf("0.00\n");
    }else{
        sort(x, x+4);  sort(y, y+4);
        printf("%.2lf\n", (x[2] - x[1]) * (y[2] - y[1]) );
    }
    return 0;
}

日拱一卒,功不唐捐。

你可能感兴趣的:(蓝桥杯,c++)