代码之家  ›  专栏  ›  技术社区  ›  user17000

网格中n个项目的平衡布局

  •  3
  • user17000  · 技术社区  · 5 年前

    我有一个N个标志列表显示在一个网格中,每行最多3个。 有什么算法可以决定每行显示多少个徽标,这样每行的徽标数量就尽可能平衡,而不使用超过最小可能行数的行数?

    例如:

     n -> number in each row
     1 -> 1
     2 -> 2
     3 -> 3
     4 -> 2, 2
     5 -> 3, 2
     6 -> 3, 3
     7 -> 3, 2, 2
     8 -> 3, 3, 2
     9 -> 3, 3, 3
    10 -> 3, 3, 2, 2
    
    4 回复  |  直到 14 年前
        1
  •  11
  •   Mark Byers    14 年前
    • 对于n<=3,只需使用n。
    • 如果n可以被3整除,那么使用:3 3…三
    • 如果n除以3有余数1,则使用:3 3…2 2
    • 如果n除以3有余数2,则使用:3 3…3 2
        2
  •  6
  •   MikeyB    14 年前

    尽管你的问题令人困惑,但我认为你首先需要确定:

    number_of_rows = ceil(number_of_logos / 3.0)
    

    然后在每行中添加一个徽标,一次添加一个。

    蟒蛇:

    import math
    def partition_logos(count, lsize):
        num_lines = int(math.ceil(count / float(lsize)))
        partition = [0] * num_lines
        for i in xrange(count):
            partition[i%num_lines] += 1
        return partition
    
    >>> for i in xrange(1,11):
    ...     print partition_logos(i, 3)
    [1]
    [2]
    [3]
    [2, 2]
    [3, 2]
    [3, 3]
    [3, 2, 2]
    [3, 3, 2]
    [3, 3, 3]
    [3, 3, 2, 2]
    
        3
  •  1
  •   Heath Hunnicutt    14 年前

    python中的递归解决方案:

    def logos_by_row(N, rows):
        width = 0
        if N > 4 or N == 3:
            width = 3
        elif N == 4 or N == 2:
            width = 2
        elif N == 1:
            width = 1
    
        if width != 0:
            rows.append(width)
            logos_by_row(N - width, rows)
    
    
    answer = []
    for i in range(10):
        logos_by_row(i+1, answer)
    print answer
    
        4
  •  1
  •   anon    14 年前

    只需使用n/3计算行,使用n%3计算列

    编辑:好的,我看到你编辑了你的问题…我没看到你想在每行显示2个,如果是4个标志。但是你可以使用n mod 3来计算他们是否像其他人已经建议的那样是一个提醒

    如果n%3=0,则在每行中放置3个徽标 如果n%3=1,则将最后4个徽标放在两行中 如果n%3=2,则将3个徽标放在n行中,最后2个徽标放在单独的行中