能否完美拼成矩形

题目:给定一个N行4列的二维数组matrix,表示N个每条边不是平行于X轴就是平行于Y轴的矩形,想知道所有的矩形能否组成一个大的完美矩形。完美矩形是指拼出的整体图案是矩形,既不缺任何块,也没有重合的部分。

思路:1、每一个小矩形的面积累加起来必须是等于大矩形的面积  2、除大矩形的四个顶点只出现一次之外,其它任何小矩形的顶点都必须出现偶数次。

def isRectangleCover(matrix):
    
    import sys
    
    if len(matrix) == 0 or len(matrix[0]) == 0:
        return False
    
    mostLeft = sys.maxsize
    mostRight = -sys.maxsize
    mostDown = sys.maxsize
    mostUp = -sys.maxsize
    map_ = {}
    
    area = 0
    
    for rect in matrix:
        mostLeft = min(rect[0],mostLeft)
        mostDown = min(rect[1],mostDown)
        mostRight = max(rect[2],mostRight)
        mostUp = max(rect[3],mostUp)
        
        area += (rect[2]-rect[0]) * (rect[3] - rect[1])
        
        leftDown = rect[0] + '_' + rect[1]
        leftUp = rect[0] + '_' + rect[3]
        rightDown = rect[2] + '_' + rect[1]
        rightUp = rect[2] + '_' + rect[3]
        
        if !map_.add(leftDown):
            map.remove(leftDown)
            
        if !map_.add(leftUp):
            map.remove(leftUp)

        if !map_.add(rightDown):
            map.remove(rightDown)

        if !map_.add(rightUp):
            map.remove(rightUp)
                        
    if(mostLeft + '_' + mostDown not in map_ or 
       mostLeft + '_' + mostUp not in map_ or 
       mostRight + '_' + mostDown not in map_ or
       mostRight + '_' + mostUp not in map_ or
      len(map_)!=4):
        return False
    
    return area == (mostRight - mostLeft) * (mostUp - mostDown)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值