用左上和右下两个坐标点表示矩形(不考虑旋转的情况),给定两个矩形的坐标表示,(rectangle1_left_x,rectangle1_left_y,rectangle1_right_x,rectangle1_right_y)和,(rectangle2_left_x,rectangle2_left_y,rectangle2_right_x,rectangle2_right_y),要求返回这两个矩形的重合部分的坐标表示,如果没有重合部分就直接返回(-1,-1,-1,-1)
如图所示蓝色部分为重叠矩形,需要返回重叠矩形的左上角坐标和右下角坐标。
这道题直接看上去比较简单,可以考虑枚举法,可以枚举出所有的case,
如上图所示,枚举出所有六种情况,暴力解法,但是这个解法存在一些问题,首先要进行一个左边变化,让x坐标更小的矩形作为左边的矩形,x坐标更大的矩形作为右边的矩形,才能按照上面的6中情况进行处理,不然case数目又要double。另外由于变量名比较多,比较长,进行比较的时候,代码逻辑容易出问题,很容易写错。当然,如果思路清理,逻辑强的选手,应该没问题。
这里的暴力解法我们就不在过多进行介绍。
下面介绍一种更简单更优势的解法:
直接把二维平面投影到一维线段上进行处理,从上面的图中观察到,直接对上面的图形分别在X,Y轴上做投影,两个坐标轴上的重叠部分,就是最后应该返回的答案。
# /usr/bin/env python # -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') def get_coinclude_line(x1_lelf, x1_right, x2_left, x2_right): if x1_lelf > x2_left: x1_lelf, x1_right, x2_left, x2_right = x2_left, x2_right, x1_lelf, x1_right if x1_lelf < x2_left < x1_right < x2_right: return [x2_left, x1_right] elif x1_lelf < x2_left < x2_right < x1_right: return [x2_left, x2_right] else: return [-1, -1] def func(rectangle1_left_x, rectangle1_left_y, rectangle1_right_x, rectangle1_right_y, rectangle2_left_x, rectangle2_left_y, rectangle2_right_x, rectangle2_right_y): x_line = get_coinclude_line(rectangle1_left_x, rectangle1_right_x, rectangle2_left_x, rectangle2_right_x) y_line = get_coinclude_line(rectangle1_left_y, rectangle1_right_y, rectangle2_left_y, rectangle2_right_y) if x_line==[-1,-1]or y_line==[-1,-1]: return [-1,-1,-1,-1] else: return x_line+y_line