给定二进制矩阵,其中0代表障碍,1代表路径,找到从给定源到目的地的最小步数(仅在4个方向允许遍历)。这是一个典型的BFS问题。
来源:(0,0)目的地:(2,0)
FROM @dataset AS d
INNER JOIN Resources.emp.EmployeeComplete AS ec
ON (@dataType = 'NTID' AND ec.ntid = d.data)
OR (@dataType = 'QID' AND ec.QID = d.data)
OR (@dataType = 'Emp ID' AND ec.EmpID = d.data)
OR (@dataType = 'Email Address' AND ec.Email = d.data)
OR ((@dataType = 'Personnel ID' OR @dataType = 'Sap ID') AND ec.PersonnelID = d.data)
OR (@dataType = 'Name' AND (ec.FirstName + ' ' + ec.LastName) = d.data)
OR (@dataType = 'Name' AND (ec.PreferredName + ' ' + ec.LastName) = d.data)
OR (@dataType = 'Name' AND (ec.LastName + ', ' + ec.FirstName) = d.data)
OR (@dataType = 'Name' AND (ec.LastName + ', ' + ec.PreferredName) = d.data)
答案:5
然而,这个问题的下一部分很棘手,你可以用魔杖把零变成一个。现在你将如何找到这种情况下的最短路径。
如果我们翻转(1,0),我们可以通过3个步骤到达目的地。
典型的强力解决方案是通过将零变为一个来对每个矩阵执行BFS。我们怎样才能做得更好?
这是在一家受欢迎的公司中提出的。任何帮助都会很明显。
答案 0 :(得分:2)
这是我想到的解决方案:
为简单起见,我将矩阵视为图形。
因此,将起始位置表示为s
(顶点),将目标表示为d
(顶点)。
现在,我们将使用源s
运行一次BFS,使用源d
运行一次。
因此,我们为每个顶点v
提供从s
到v
的最小距离以及从v
到d
的最小距离(距离可以是无限远的)例如,矩阵中值为0的所有顶点都具有距离无穷大。
现在,对于矩阵中值为v
的每个顶点0
,请执行以下操作:
对于v
的每对邻居(在矩阵中,最多4个),其中的顺序事项,即,顶点a
和b
与{{}不同1}}和b
。
最多4个!/ 2! = 12对。
表示顶点对a
和a
并计算以下距离:
s-> a + 1 + 1 + b-> d(s-> a,b-> d,这是路径的距离s-> a-> v- > B-> d)
从这些距离中选择最小值(最多12个),这是从b
到s
翻转d
的最小距离。
现在,您可以知道要翻转哪一个,以及最小距离。
复杂度= O(v
+ V
)
编辑:
如果矩阵的大小为E
x n
,则n
= V
,并且每个顶点最多有4个边,然后n ^ 2
= { {1}} => E
。