给定大小为matrix A
的{{1}},对于所有i,j,我们拥有(n*m)
或aij=1
,如果aij=0
被称为“黑色”,否则为“白色”,两点aij=1
和p(i,j)
之间的距离定义如下:
q(k,l)
。
在d(p,q)=|i-k|+|j-l|
时间内是否运行任何算法来找到所有白点的白点及其最近的黑点?
O(mn)
答案 0 :(得分:1)
我认为我们在同一所大学。 我认为永仁的答案不正确。您的答案只能覆盖黑人的上,下,左,右,如果白人的上,下,左,右都没有黑色,那将是错误的最短距离。
这是我的答案:
dp1[i][j] = min(dp1[i-1][j], dp1[i][j-1])+1 if A[i][j]=1 else 0
dp2[i][j] = min(dp2[i-1][j], dp2[i][j+1])+1 if A[i][j]=1 else 0
dp3[i][j] = min(dp3[i+1][j], dp3[i][j-1])+1 if A[i][j]=1 else 0
dp4[i][j] = min(dp4[i+1][j], dp4[i][j+1])+1 if A[i][j]=1 else 0
res[i][j] = min(dp1[i][j], dp2[i][j], dp3[i][j], dp4[i][j])
答案 1 :(得分:0)
我遇到同样的问题。你明天准备算法考试吗?
我的想法如下。
let res[m][n] be new array // it restore shortest path between (m,n) and neast black point, if A[m,n] is black, res[m][n] should be zero.
InitQueue(Q)
// init
for i=1 to m
for j=1 to n
if A[i][j] == 1
res[i][j] = 0
push(Q, (i, j)) // (i, j) is a location, like tuple in python
else
res[i][j] = ∞
while Q!=Ø
(i, j) = pop(Q)
for each location (u, v) ∈ Adjacent(i, j) // top、bottom、left、right
if res[u, v] > res[i][j]+1
push(Q, (u, v)) // I ignored before
res[u][v] = res[i][j]+1
-----更新-----
感谢@ matrix123指出我的错误,我修改了答案并欢迎您 再次审核。
我的声誉不超过50,在这里仅评论matrix123的答案。
首先,您有一个小错误,“ if A [i] [j] = 1 else 0”应替换为“ if A [i] [j] = 0 else 0”,因为如果A [i] [j ] = 1('black'),我们知道最远距离直接为0。
第二,我不知道您首先循环哪个节点,“黑色”节点?您的终止条件是什么?期待您的完整代码。
这个问题的讨论很有趣。