这是我需要解决的计算机视觉问题的简化版本。假设您有参数 n,q 并且必须计算将整数 0..(q-1) 分配给 n×n 网格的元素的方式的数量,以便对于每个分配,以下都是正确的
- 没有两个邻居(水平或垂直)获得相同的值。
- 位置 (i,j) 的值为 0
- 位置 (k,l) 的值为 0
由于 (i,j,k,l) 没有给出,输出应该是上面的评估数组,对于 (i,j,k,l) 的每个有效设置一个
下面是蛮力方法。目标是获得一种适用于 q<=100 和 n<=18 的有效算法。
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论坛上问过这个问题,他们的解决方案是迄今为止我见过的最有效的解决方案(根据作者的估计,n = 10,任何 q 大约需要 3 小时)