hdu_2056(Rectangles)

题目不多解释,就是计算两个长方形的交集面积

http://acm.hdu.edu.cn/showproblem.php?pid=2056

      我的方法不是最简单的,但是我觉得是很易懂得,可读性很高。个人觉得代码简洁是一方面,但是可读性也一点不亚于简洁和高效。对于新手,或者做acm的人可能会忽视这点,觉得代码少,速度快,正确过关就ok了,毕竟这些代码一旦 ac 就几百年都不会去看了。但是等到,学习过应用软件的设计之后,代码的可读性的重要就显而易见,因为经常需要修改,需要和别人合作,如果都是参数都是x1、x2 ... 函数都是fun1()  fun2() 别说别人的看不懂,自己的都看到头大。(补充: 我并不是高手、也没有一线开发经验,还是个大一学生,但有些东西,不用太多经验就能够想清楚,现在就要开始养成良好习惯)

     写acm不一定就是为了进集训队,可以用来提高编程水平,保持感觉,培养良好的编程习惯;

    

  废话说多了,进入正题。

  此题不难,相信大家都知道,但是就是一个烦,分析的情况较多,容易遗漏,出错,而且出错后难以查找。所以我使用c++的类,来封装Rectangle;如下:

class Rectangle
{
private:
    double x_1, x_2, y_1, y_2;
    double center_x, center_y;
    double width, height;
public:
    Rectangle(double x1, double y1, double x2, double y2);
    friend Rectangle findTheRectangle(Rectangle& , Rectangle&);   //找到可能存在的长方形,如果存在相交的部分,它也是一个长方形,而且一定是x1, x2, x3, x4和
//y1, y2, y3, y4中除去最大、最小点后,剩下的4个点组成。 friend
double calculateTheAer(Rectangle&, Rectangle&, Rectangle&); //计算面积,前两个参数是原始的长方形,最后一个参数是上一步计算出来的长方形。通过原
                                           //始长方形的中点距离和长宽比较,判断交集是否存在,存在就返回第三个参数的面积,不存
                                           //在就返回 0 。 };

有了这个类 题目分析就一目了然了,如果做出来出错,通过试调也就马上可以查出错误,是不是复杂的分析马上就简单了?
完整代码如下:

#include <iostream>
#include <cmath>

using namespace std;

class Rectangle
{
private:
    double x_1, x_2, y_1, y_2;
    double center_x, center_y;
    double width, height;
public:
    Rectangle(double x1, double y1, double x2, double y2);
    friend Rectangle findTheRectangle(Rectangle& , Rectangle&);    
    friend double calculateTheAer(Rectangle&, Rectangle&, Rectangle&);
};

Rectangle::Rectangle(double x1, double y1, double x2, double y2)
{
    x_1 = x1 > x2 ? x2 : x1;          //构造函数中保证  x_1 < x_2, y_1 < y_2;方便之后的计算
    x_2 = x1 > x2 ? x1 : x2;

    y_1 = y1 > y2 ? y2 : y1;
    y_2 = y1 > y2 ? y1 : y2;

    center_x = (x1 + x2) / 2;
    center_y = (y1 + y2) / 2;

    width = x_2 - x_1;
    height = y_2 - y_1;
}

Rectangle findTheRectangle (Rectangle& r1, Rectangle& r2)
{
    double x1, x2, y1, y2;
    
    x1 = r1.x_1 > r2.x_1 ? r1.x_1 : r2.x_1;
    x2 = r1.x_2 > r2.x_2 ? r2.x_2 : r1.x_2;

    y1 = r1.y_1 > r2.y_1 ? r1.y_1 : r2.y_1;
    y2 = r1.y_2 > r2.y_2 ? r2.y_2 : r1.y_2;

    return Rectangle(x1, y1, x2, y2);
}

double calculateTheAer(Rectangle& r1, Rectangle& r2, Rectangle& r3)
{
    if (fabs(r1.center_x - r2.center_x) < (r1.width + r2.width) / 2 && fabs(r1.center_y - r2.center_y) < (r1.height + r2.height) / 2)
    {
        return r3.width * r3.height;
    }
    else 
        return 0.0;
}

int main ()
{
    double x1, x2, x3, x4, y1, y2, y3, y4;
    while (cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4)
    {
        Rectangle r1(x1, y1, x2, y2);
        Rectangle r2(x3, y3, x4, y4);

        Rectangle r3 = findTheRectangle(r1, r2);

        printf("%.2lf\n" ,calculateTheAer(r1, r2, r3));
    }

    return 0;
}

 

 

转载于:https://www.cnblogs.com/lky-mily/archive/2012/07/30/2615060.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值