2010-05-19 72 views
3

我有一个网格中显示的n个标识的列表,每行最多3个。 什么是决定每行显示多少行的算法,以便每行标志的数量尽可能均衡,而不超过最小可能的行数?在一个网格中的n个项目的平衡布局

例如:

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 
+2

你的要求.. 。失踪。我们是否应该把这个数字分解成更小的部分?按什么规则? – 2010-05-19 19:25:13

+0

您是否尝试打印可能的方式来表示您的号码?你知道有无数的方法可以做到这一点,对吧? – Seth 2010-05-19 19:26:43

+0

箭头右边的数字总和为左边的数字。我认为他的意思是“如果我有8个标志可以显示,我想要2行3行(最多3行),然后我想让最后一行剩下2行。但是如果有4行,我想要2×2“。 – 2010-05-19 19:28:01

回答

11
  • 对于N < = 3只使用N.
  • 如果N是由3整除然后使用:3 3 ... 3
  • 如果N时除以3有余数1则用:3 3 ... 2 2
  • 如果N除以3后有余数2则用:3 3 ... 3 2
+0

错过了特例N = 1 – 2010-05-19 19:32:25

+0

@Heath:谢谢,修正。 – 2010-05-19 19:35:01

+0

你怎么能用'3 3 ... 2 2'来代替'4'?这不会打印'4'的'3 1'吗? – IVlad 2010-05-19 19:37:03

6

AS令人混淆,因为你的问题,我想你需要做的是首先确定:

number_of_rows = ceil(number_of_logos/3.0) 

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

的Python:

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] 
+0

+1 - 非常简单:) – 2010-05-19 19:31:33

+0

此解决方案的另一个优点是3不是硬编码的。 – 2010-05-19 19:42:27

+1

谢谢。是不是程序员的工作中的一部分不明确,不明确的要求,并将它们提炼成一个整洁,整洁的解决方案? ;) – MikeyB 2010-05-19 19:51:54

1

只使用N/3计算列N%(3)计算列

编辑:好的,我看到你编辑你的问题....我嚣吨看到,如果是4标志,你想在每行显示2。但然后你可以使用n模3来计算它们是否是其他人已经建议的提醒

如果n%3 = 0那么只需在每一行中放3个标志 如果n%3 = 1则将最后4个标志在两行 如果n%3 = 2然后放于正第3个标志和最后2个徽标在单独一行

+0

这会给3 3 3 1 10,其中提问者想要3 3 2 2(即试图更好地平衡行)。 – psmears 2010-05-19 19:33:59

+0

是的,我还在编辑sry;) – 2010-05-19 19:37:36

1

递归的解决方案,在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