合并多张大小不一的图片,并使它面积最小

要使合并得到的面积最小,得使拼接形成的空隙最小。因为图片总和的面积是不变的,无论怎么拼,这部分面积不会改变。而用于弥补长短边造成的空隙因拼接方法不一样,会有大有小。
此次赵进的需求是所有图形都是矩形。
对于以上算法实施有两种选择:1.贪心算法。2.动态规划算法。

贪心法每次选择较大的图片拼接在一起,空隙地方用小图片填充。 动态规划:每次选择最优的算法,基于这个最优的算法逐级形成最优算法。
相比而言,贪心算法最快,但形成的结果往往不是最优。而动态规划需要花些时间计算,结果往往比贪心算法好。但也不是绝对的,有极少情况,贪心算法算出来的比动态规划好。

此算法选用动态规划思想,算法步骤如下:
1. 把所有要拼接图形的边长(长、宽)形成一个集合S。
2. 从集合中选出边长最小,且相近(相等优先)边长的两个图片,并拼接在一起。若待选择的两个图形最小的边长相同,则选择面积最小的图形。
3. 重新计算这个拼接在一起的图形的边长,并更新到集合S。
4. 循环步骤1,只到所有的图形拼接完毕(S集合为空)。

这样使每次形成的空隙最小,下一次拼接也是基于上一次基础的,如此循环,拼接出图形的面积是最小的。
大家可以在纸上画一些大小不一的矩形,然后按我的算法做拼接。若能找出一种拼接出来的面积比我的小,说明我的算法不是最优的。
此算法容易实现,操作集合S,根据拼接确定坐标即可。
个人愚见,期待更好的算法。

例子:
点击查看原始尺寸
可算得左图面积:27, 右图面积:45。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这个问题可以使用贪心算法来解决。首先将所有矩形按照面积从大到小排序,然后按照顺序依次将它们放在平面上。 具体的实现步骤如下: 1. 计算所有矩形面积并按照面积从大到小排序。 2. 将第一个矩形放在平面的左上角(或者任何一个位置都可以)。 3. 依次将后面的矩形放在平面上,找到可以放置它的位置使得平面的面积最小。具体的做法是遍历平面上所有可能的位置,找到一个位置使得所有已经放置的矩形都不会和这个矩形相交,并且这个位置离平面的边界最近。 4. 重复步骤3,直到所有矩形都被放置在平面上。 5. 返回平面的面积。 下面是一个Python程序的示例代码: ```python class Rectangle: def __init__(self, w, h): self.width = w self.height = h self.area = w * h def merge_rectangles(rectangles): # 按照面积从大到小排序 rectangles = sorted(rectangles, key=lambda r: r.area, reverse=True) # 第一个矩形放在左上角 x, y = 0, 0 w, h = rectangles[0].width, rectangles[0].height for r in rectangles[1:]: # 遍历所有可能的位置,找到最小面积 best_area = float('inf') best_x, best_y = None, None for i in range(x + w, -1, -1): for j in range(y + h, -1, -1): # 检查这个位置是否可以放置矩形 if all(not intersect(r, p, i, j) for p in rectangles[:rectangles.index(r)]): area = (max(i + r.width, x + w) - x) * (max(j + r.height, y + h) - y) if area < best_area: best_area = area best_x, best_y = i, j # 放置矩形 x, y = best_x, best_y w, h = r.width, r.height # 返回面积 return (x + w) * (y + h) def intersect(r1, p, x, y): # 判断矩形r1和(p, x, y)是否相交 return ((p.width > 0 and x < p.width and y < p.height) or (p.height > 0 and y < p.height and x < p.width) or (p.width == 0 and x == 0) or (p.height == 0 and y == 0)) # 示例 rectangles = [Rectangle(1, 2), Rectangle(2, 3), Rectangle(3, 4)] print(merge_rectangles(rectangles)) # 输出 12,即最小面积 ``` 这个算法的时间复杂度是O(n^2),其中n是矩形的数量。在实际应用中,可能需要使用更高效的算法来处理大规模数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值