我是第一次参加这种优快云举办的竞赛,首先这次竞赛是有四道单选题和两道编程题。单选题是有关大数据的,问的也比较基础,大数据基础好的同学解答起来也比较简单。
另外两道编程题,一个是有关求矩阵面积,另一个是有关机器猫移动的问题,接下来我一一描述和解答一下这两个题目的解法。
一、求矩阵面积
题目简要描述:
给你二维平面上两个由直线构成且边与坐标轴平行/垂直的矩形,请你计算并返回两个矩形覆盖的总面积。每个矩形由其左下顶点和右上顶点坐标表示:设第一个矩形左下顶点(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++写了同样思路的解答,就迎刃而解了。
建议:
竞完赛之后,我希望官方能够给出一下,各种语言的解题代码或者思路啥的,因为这样参赛者在答完题目之后,才能知道自己错在哪里,离正确答案有什么不足之处。