华为机试【19、矩形相交的面积】

19、标题:矩形相交的面积
【矩形相交的面积】在坐标系中,给定3个矩形,求相交区域的面积。
输入描述:
3行输入分别为3个矩形的位置,分别代表“左上角x坐标”,“左上角y坐标”,“矩形宽”,“矩形高” -1000<=x,y<1000
输出描述:
输出3个矩形相交的面积,不相交的输出0
alt

示例:
输入
1 6 4 4
3 5 3 4
0 3 7 3
输出
2

def square_intersection_area(s1, s2, s3):
    a1 = [int(x) for x in s1.split(" ")]
    a2 = [int(x) for x in s2.split(" ")]
    a3 = [int(x) for x in s3.split(" ")]

    def have_comm(aaa1, aaa2):
        """返回两个区间的交集"""
        if aaa1[0] <= aaa2[0] and aaa1[1] >= aaa2[0]:
            return [aaa2[0], min(aaa1[1], aaa2[1])]
        elif aaa2[0] <= aaa1[0] and aaa2[1] >= aaa1[0]:
            return [aaa1[0], min(aaa1[1], aaa2[1])]
        return False

    def area(aa1, aa2):
        """返回相交部分矩形的信息数组:[“左上角x坐标”,“左上角y坐标”,“矩形宽”,“矩形高”]"""
        a = [aa1[0], aa1[0] + aa1[2]]  # 矩形1的x坐标区间
        b = [aa2[0], aa2[0] + aa2[2]]  # 矩形2的x坐标区间
        c = [aa1[1] - aa1[3], aa1[1]]  # 矩形1的y坐标区间
        d = [aa2[1] - aa2[3], aa2[1]]  # 矩形2的y坐标区间
        # 当区间a、b有交集,且区间d、d有交集的时候,说明矩形1、2相交
        if have_comm(a, b) and have_comm(c, d):
            xx = have_comm(a, b)
            yy = have_comm(c, d)
            return [xx[0], yy[1], xx[1] - xx[0], yy[1] - yy[0]]
        return False

    area1 = area(a1, a2)
    area2 = area(area1, a3) if area1 else False
    if area2:
        return area2[2] * area2[3]
    return 0


print(square_intersection_area("1 6 4 4", "3 5 3 4", "0 3 7 3"))
全部评论
def fun0(l): left = l[0] right = l[0] + l[2] up = l[1] down = l[1] - l[3] return [left, right, up, down] def func(): a = [int(i) for i in input().split(" ")] b = [int(i) for i in input().split(" ")] c = [int(i) for i in input().split(" ")] a = fun0(a) b = fun0(b) c = fun0(c) left = max(a[0], b[0], c[0]) right = min(a[1], b[1], c[1]) up = min(a[2], b[2], c[2]) down = max(a[3], b[3], c[3]) if left < right or up > down: return (up - down) * (right - left) else: return 0 print(func()) 我想的是找最左的右边,最上的下边,最右的左边,最下的上边,然后计算面积,但感觉可能会有疏漏
点赞 回复
分享
发布于 2022-06-20 16:27
我也是这道题,只过了60%,知道自己有疏漏,但没想好怎么写
点赞 回复
分享
发布于 2022-07-08 01:00
小红书
校招火热招聘中
官网直投
public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int x1 = in.nextInt(); int y1 = in.nextInt(); int w1 = in.nextInt(); int h1 = in.nextInt(); int x2 = in.nextInt(); int y2 = in.nextInt(); int w2 = in.nextInt(); int h2 = in.nextInt(); int x3 = in.nextInt(); int y3 = in.nextInt(); int w3 = in.nextInt(); int h3 = in.nextInt(); int width = Math.min(Math.min(x1+w1,x2+w2),x3+w3)-Math.max(Math.max(x1,x2),x3); int height = Math.min(Math.min(y1,y2),y3)-Math.max(Math.max(y1-h1,y2-h2),y3-h3); if (width > 0 && height > 0){ System.out.println(width * height); }else { System.out.println(0); } } } 找到最小的y减去最大的y-h,并保证这个值大于零的(这个值是相交矩形的高),找到最小的x+w减去最大的x,并保证这个值是大于零的(这个值是相交矩形的宽),最后相乘即是答案。
点赞 回复
分享
发布于 2023-08-21 14:15 北京
const getArea = (arr1, arr2, arr3) => { let first = intersectSqua(arr1, arr2) if (isRange(first)) { let serond = intersectSqua(first, arr3) if (isRange(serond)) { return serond[2] * serond[3] } } return 0 } const intersectSqua = (arr1, arr2) => { let x = Math.max(arr1[0], arr2[0]) let y = Math.min(arr1[1], arr2[1]) let x1 = Math.min(arr1[0] + arr1[2], arr2[0] + arr2[2]) let y1 = Math.max(arr1[1] - arr1[3], arr2[1] - arr2[3]) return [x, y, x1 - x, y - y1] } const isRange = (arr1) => { return arr1[2] > 0 && arr1[3] > 0 }
点赞 回复
分享
发布于 2023-08-24 10:03 江苏

相关推荐

1 3 评论
分享
牛客网
牛客企业服务