CSDN第62期竞赛题解与感想

我是第一次参加这种CSDN举办的竞赛,首先这次竞赛是有四道单选题和两道编程题。单选题是有关大数据的,问的也比较基础,大数据基础好的同学解答起来也比较简单。

另外两道编程题,一个是有关求矩阵面积,另一个是有关机器猫移动的问题,接下来我一一描述和解答一下这两个题目的解法。

一、求矩阵面积

题目简要描述:

给你二维平面上两个由直线构成且边与坐标轴平行/垂直的矩形,请你计算并返回两个矩形覆盖的总面积。每个矩形由其左下顶点和右上顶点坐标表示:设第一个矩形左下顶点(ax1 , ay1)、右上顶点(ax2, ay2)。第二个矩形左下顶点(bx1, by1)、右上顶点(bx2,by2)。

解题思路:

这个题是比较简单的算法题,分两种情况考虑即可。

1、当两个矩阵不相交的时候,只需分别计算两个矩阵的面积相加即可。[abs(ax2-ax1)*abs(ay2-ay1)]+[abs(bx2-bx1)*abs(by2-by1)]

2、当两个矩阵相交的时候,不仅需要求出两个矩阵的面积相加,并且还要求出它们相交的矩形的面积,这里的主要难点就是求出两个相交矩形的面积。其实只需画个图就很明了了,相交矩形的面积:[min(ay2, by2) - max(ay1, by1)]*[min(ay2, by2) - max(ay1, by1)];最后只需用两个矩形的面积之和-相交矩形的面积即可。

c++代码:

#include <iostream>
#include <algorithm>

int compute_area(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
    int area_a = std::abs(ax2 - ax1) * std::abs(ay2 - ay1);
    int area_b = std::abs(bx2 - bx1) * std::abs(by2 - by1);
    
    int overlap_width = std::max(std::min(ax2, bx2) - std::max(ax1, bx1), 0);
    int overlap_height = std::max(std::min(ay2, by2) - std::max(ay1, by1), 0);
    
    int overlap_area = overlap_width * overlap_height;
    
    int total_area = area_a + area_b - overlap_area;
    return total_area;
}

int main() {
    int ax1, ay1, ax2, ay2, bx1, by1, bx2, by2;
    std::cin >> ax1 >> ay1 >> ax2 >> ay2 >> bx1 >> by1 >> bx2 >> by2;

    // 计算总面积
    int total_area = compute_area(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2);

    // 输出结果
    std::cout << total_area << std::endl;

    return 0;
}
二、机器猫移动

题目简要描述:

机器猫初始位置在原点(0,0),机器猫输入一串指令command,机器猫就会无限循环这条指令移动。指令有四种: U:向y轴正方向移动一格。R:向x轴正方向移动一格。D:向y轴负方向移动一格。L:向x轴负方向移动一格。且在 xy 平面上放一些障碍物,用barriers表示。机器猫不能碰到障碍物。检测机器猫能否完好地到达终点。如果能,返回true;否则返回false。

解题思路:

这里有三种情况:

1、机器猫先碰到barriers,机器猫损害,返回false。

2、机器猫先到达终点,返回true。

3、机器猫既没有碰到barriers也没有到达终点,返回false。

这个题,我没有解决好,当时少考虑了一种情况先到达终点的情况,所以只对了三分之二。

注意:

在本次竞赛中,我之前是先用python写了第一题,而且我思来想去了很久,始终没有发现问题,但是始终就是运行超时了,在这里卡了很久,估计是因为python运行慢的原因;后面用c++写了同样思路的解答,就迎刃而解了。

建议:

竞完赛之后,我希望官方能够给出一下,各种语言的解题代码或者思路啥的,因为这样参赛者在答完题目之后,才能知道自己错在哪里,离正确答案有什么不足之处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值