【发布时间】:2011-05-07 12:06:18
【问题描述】:
这是我需要解决的计算机视觉问题的简化版本。假设给定参数 n,q 并且必须计算将整数 0..(q-1) 分配给 n×n 网格的元素的方式的数量,以便对于每个分配,以下都是正确的
- 没有两个邻居(水平或垂直)获得相同的值。
- 位置 (i,j) 的值为 0
- 位置 (k,l) 的值为 0
由于没有给出 (i,j,k,l),因此输出应该是上面的评估数组,每个有效设置对应 (i,j,k,l)
下面是蛮力方法。目标是获得一种适用于 q
def tuples(n,q):
return [[a,]+b for a in range(q) for b in tuples(n-1,q)] if n>1 else [[a] for a in range(q)]
def isvalid(t,n):
grid=[t[n*i:n*(i+1)] for i in range(n)];
for r in range(n):
for c in range(n):
v=grid[r][c]
left=grid[r][c-1] if c>0 else -1
right=grid[r][c-1] if c<n-1 else -1
top=grid[r-1][c] if r > 0 else -1
bottom=grid[r+1][c] if r < n-1 else -1
if v==left or v==right or v==top or v==bottom:
return False
return True
def count(n,q):
result=[]
for pos1 in range(n**2):
for pos2 in range(n**2):
total=0
for t in tuples(n**2,q):
if t[pos1]==0 and t[pos2]==0 and isvalid(t,n):
total+=1
result.append(total)
return result
assert count(2,2)==[1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1]
11 月 11 日更新 我也在 TopCoder forums 上问过这个问题,他们的解决方案是我迄今为止见过的最有效的解决方案(根据作者的估计,n=10,任意 q 大约需要 3 小时)
【问题讨论】:
-
@Yaroslav:如果您将代码缩进四个空格,它将被格式化。您可以使用编辑器上方的“代码示例”按钮。只需突出显示您的代码并点击上面带有二进制数字的按钮。
-
看不懂
and value at positions (i,j), (k,l) is 0, for every combination of i,j,k,l -
此外,所有着色定理都适用于任意地图,但这仅适用于简单的网格。给这个网格上色非常简单,应该有一种相当直接的方法来计算所有可能的颜色。
-
洛伊克和贝利撒留:是的,我将这两个位置的颜色固定为零。由于没有给出 (i,j,k,l),我必须遍历 (i,j,k,l) 的每个组合,并给出如果特定的 i,j,k,l提供了组合
标签: python complexity-theory dynamic-programming