宽度优先搜索扭曲

时间:2018-05-22 23:07:21

标签: graph-theory graph-algorithm breadth-first-search

给定二进制矩阵,其中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。我们怎样才能做得更好?

这是在一家受欢迎的公司中提出的。任何帮助都会很明显。

1 个答案:

答案 0 :(得分:2)

这是我想到的解决方案:

为简单起见,我将矩阵视为图形。

因此,将起始位置表示为s(顶点),将目标表示为d  (顶点)。

现在,我们将使用源s运行一次BFS,使用源d运行一次。

因此,我们为每个顶点v提供从sv的最小距离以及从vd的最小距离(距离可以是无限远的)例如,矩阵中值为0的所有顶点都具有距离无穷大。

现在,对于矩阵中值为v的每个顶点0,请执行以下操作:

对于v的每对邻居(在矩阵中,最多4个),其中的顺序事项,即,顶点ab与{{}不同1}}和b

最多4个!/ 2! = 12对。

表示顶点对aa并计算以下距离:

s-> a + 1 + 1 + b-> d(s-> a,b-> d,这是路径的距离s-> a-> v- > B-> d)

从这些距离中选择最小值(最多12个),这是从bs翻转d的最小距离。

现在,您可以知道要翻转哪一个,以及最小距离。

复杂度= O(v + V

编辑:

如果矩阵的大小为E x n,则n = V,并且每个顶点最多有4个边,然后n ^ 2 = { {1}} => E