用小方块填充矩形的算法?

时间:2011-06-24 04:17:55

标签: algorithm

给定一个宽度和高度的矩形,用n个正方形填充它(n是整数,也给出),这样正方形覆盖尽可能多的矩形区域。 应返回单个正方形的大小。

想法?

4 个答案:

答案 0 :(得分:6)

正方形不一定必须与较大的矩形相同。这些问题被称为包装问题,找到最佳解决方案是非常困难的。

对于n正方形包装的较大形状为正方形的情况下的优秀处理,请参阅Erich Friedman的论文Packing Unit Squares in Squares: A Survey and New Results

例如,哥德尔是第一个发表这个主题的人。他发现a2 + a + 3 +(a-1)√2个正方形可以通过在45度角放置一条斜条形正方形来包装在a + 1 + 1 /√2的正方形中。例如,

Gödel's 5 square solution

为了好玩,我强烈建议您查看Erich's Packing Center

答案 1 :(得分:1)

假设所有的方块都是对齐的并且它们的大小相同,你可以通过在方块的边长上进行二进制搜索来找到它:

import math

def best_square(w, h, n):
    hi, lo = float(max(w, h)), 0.0
    while abs(hi - lo) > 0.000001:
        mid = (lo+hi)/2.0
        midval = math.floor(w / mid) * math.floor(h / mid)
        if midval >= n:
            lo = mid
        elif midval < n: 
            hi = mid
    return min(w/math.floor(w/lo), h/math.floor(h/lo))

答案 2 :(得分:1)

我知道这个问题是很久以前的事了,但这就是我的意思:

你有n个方格 你有一个矩形 你想知道填充矩形的正方形的大小

例如:

rectangle of 1280*720 filled with 100 squares. 
The surface is 1280*720=921600
1 square should have the surface of 921600/100 = 9216
so the square size is sqrt(9216)=96

最后它只是一个返回结果的函数:

sqrt((width*height)/n)

答案 3 :(得分:0)

这是我的解决方案 这个想法是继续循环 假设你从square_counter = 0开始

长度和呼吸: //找到最大可能的方块

Count1 =长度/呼吸//发言

Square_counted + = count1

新平衡长度=长度 - 计数1 *呼吸

现在正方形,最大尺寸可能是呼吸

Count2 =呼吸/长度

Square_count + = count2

呼吸=呼吸 - 计数*长度