欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-19 12:21:34
...

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


心路历程:

第一阶段:

最初想独立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<bits/stdc++.h>
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++ 蓝桥杯