【发布时间】:2015-01-19 17:16:46
【问题描述】:
让我介绍一下问题:
你有一个像这个一样的二维码(二维码在这个问题中总是一个正方形)。
one http://img11.hostingpics.net/pics/514457code.png
您可以从 QR 码顶部的任何位置开始(因此在第一行的任何位置),并且您必须找到到达底线任何位置的案例的路径(因此在最后一行的任何位置)。
你必须尽量减少路径中的黑格数,如果你有几条黑格数相同的路径,你必须找到最短的那一个。
solution 的示例:
找到一种算法来找到满足这些条件的最短路径。
我的解决方案
首先,我将问题视为有向网格图,其中每个像素都是一个顶点,每个顶点的边数与邻居数一样多。
例如,左上角的顶点可以到达它的右邻居和它的下邻居。
我将边缘的权重属性如下:
- 对于从白色外壳到黑色外壳的边缘 -> 重量为 1
- 对于从白盒到白盒的边缘 -> 权重 0 + 小值
- 对于从黑色外壳到白色外壳的边缘 -> 宽度为 0 + 一个小值
- 对于从黑色外壳到黑色外壳的边缘 -> 重量为 1
这里有一个小值(
因此,对于这种表示,令 V 为顶点数,W 为一条线中的顶点数,E 为边数,我们有 E = W(W-1)*2*2。
然后我创建 2 个子集:第一个包含所有可能的起始顶点(二维码的第一行,因此 W 个顶点),另一个包含可能的最终目的地(最后一行,因此 W 个顶点)。
我使用 Dijkstra 计算 O(V lg(V)) 中的最短路径(使用我使用的库),我对所有起始节点执行 W 次,并寻找到每个目标顶点的最短路径。
所以我找到了 O(V*W lg(V)) = O(V^3/2 Lg(V)) 中的最短路径。
问题
你有更好的解决这个问题的方法吗?使用网格图表示或其他方式?
【问题讨论】:
标签: algorithm graph graph-algorithm