让我来介绍一下这个问题:
你有一个二维码(QR码在这个问题上总是一个正方形),就像这个一样
one http://img11.hostingpics.net/pics/514457code.png
你可以从QR码顶部的任何地方开始(所以在第一行的任何地方),你必须找到一条路径到达底线的任何地方(所以在最后一行的任何地方)。
您必须尽量减少路径中的黑色案例数量,如果您有多条路径具有相同数量的黑色案例,则必须找到最短的案例。
solution的示例:
找到一个算法来找到那些条件的最短路径。
我的解决方案
首先,我将问题视为有向网格图,其中每个像素都是一个顶点,每个顶点都有与邻居一样多的边。
因此,例如,左上角的顶点可以到达其右邻居及其底部邻居。
我将边缘的权重归属如下:
在我们有几条具有相同黑色案例数量的路径的情
因此,使用此表示法,令V为顶点数,W为一行中顶点数,E为边数,我们有E = W(W-1)* 2 * 2.
然后我创建了2个子集:第一个包含所有可能的起始顶点(QR码的第一行,所以是W顶点),另一个包含可能的最终目的地(最后一行,因此是W顶点)。
我使用Dijkstra来计算O(V lg(V))中的最短路径(使用我使用的库),我为所有起始节点做了W次,我寻找到每个目标顶点的最短路径。
所以我找到O(V * W lg(V))= O(V ^ 3/2 Lg(V))的最短路径。
问题
你有更好的解决方案吗?使用网格图表示或其他什么?
答案 0 :(得分:1)
这是一个更快的解决方案:
让我们找到包含最少数量黑色单元格的路径。我们可以使用0-1广度优先搜索。导致白色单元格的边缘应具有权重0
,并且通向黑色单元格的边缘应具有权重1
。不需要分别从顶行的每个顶点运行它:我们可以在开始时将它们全部添加到队列中,然后只运行一次广度优先搜索(我们不应该忘记添加所有白色单元格)黑色之前的第一行)。
如果u
,我们可以调用从v
到dist[v] == dist[u] + weight(u, v)
的有向边缘。现在,我们可以在仅包含“良好”边缘的图形上运行简单的广度优先搜索(再次,来自批处理中顶行的所有单元格)(这次所有边缘都具有权重1
)。
现在我们可以选择最后一行中最好的单元格。
这个解决方案需要O(V)
时间(它只有两个广度优先搜索)并且它总能产生最佳答案(不需要小的幻数)。