0

我正在尝试为这个问题创建一个解决方案,我的代码专注于循环(for 和 while):

令参数 Q 为“矩形”列表,由左下角的宽度、高度和 (x,y) 位置指定。Enclosure(Q) 返回包含 Q 中每个矩形的最小矩形。矩形的表示方式是元组,(x,y,width,height)。

到目前为止,这是我的代码:

def Enclosure(Q):
    c = []
    d = []
    for (x,y,width,height) in sorted(Q):
        c.append(x)
        d.append(y)
    print(c)
    print(min(c))
    e=tuple([min(c)]+[min(d)])
    print(e)

忽略打印​​语句,这些语句仅用于调试目的。到目前为止,我的代码创建了一个包含矩形左下角的 (x,y) 坐标的元组,我试图将其设为程序形式。但在此之后,我完全不知道如何找到封闭矩形的(高度,宽度)。我怎样才能做到这一点?

此外,这是程序在运行时应该执行的示例:

R1 = (10,20,5,100) #R1,R2,R3 are each rectangles
R2 = (15,5,30,150) #layout of the tuple:(x,y,width,height)
R3 = (-4,30,20,17)
Enclosure([R1,R2,R3])
(-4, 5, 49, 150) #rectangle that encloses R1,R2,R3
4

2 回答 2

0

尝试这个:

def Enclosure(Q):
    c = []
    d = []
    x2 = []
    y2 = []
    for (x,y,width,height) in sorted(Q):
        c.append(x)
        d.append(y)
        x2.append(width + x)
        y2.append(height + y)
    e = tuple([min(c)]+[min(d)] + [max(x2) - min(c)] + [max(y2) - min(d)])
    print(e)

您可以替换e = tuple...为:

e=(min(c), min(d), max(x2) - min(c), max(y2) - min(d)) # This makes a tuple directly

避免首先创建一个列表,然后像您一样将其转换为元组。

于 2013-10-28T20:47:14.767 回答
-2

确保你能解释为什么你使用继承,否则你的老师会知道你在作弊:

class Geometry(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y


class Point(Geometry):
    def __repr__(self):
        return "<Point at {s.x},{s.y}>".format(s=self)


class Rectangle(Geometry):
    def __init__(self, x, y, width, height):
        super(Rectangle, self).__init__(x, y)
        self.width = width
        self.height = height

    @property
    def oposite_corner(self):
        return Point(self.x + self.width, self.y + self.height)

    def __repr__(self):
        return "<Rectange of {s.width}x{s.height} at {s.x},{s.y}>".format(s=self)


def enclosing_rectangle(rect_list):
    x1, y1, x2, y2 = (
        min([r.x for r in rect_list]),
        min([r.y for r in rect_list]),
        max([r.oposite_corner.x for r in rect_list]),
        max([r.oposite_corner.y for r in rect_list]),
    )
    return Rectangle(x1, y1, x2 - x1, y2 - y1)

请自行测试并修复任何错误(提示:已super更改):

>>> l = [Rectangle(1, 2, 3, 4), Rectangle(-1, -1, 1, 1), Rectangle(3, 4, 1, 1)]
>>> enclosing_rectangle(l)
<Rectangle of 5x7 at -1,-1>

[更新]

什么?!?删除投票?想解释一下这个答案有什么令人反感的地方吗?

于 2013-10-28T20:56:03.987 回答