阻塞一个单元后,带有障碍物的矩形网格中的路径数

时间:2014-12-21 13:51:40

标签: algorithm

给定一个大小为NxN的方格,每个单元格为空或有障碍物,只阻挡一个单元格,以便最小化从左上角到右下角的路径数量。您只能向下或向右移动一步。阻止一个单元格后,计算从左上角到右下角单元格的路径数。总是至少有3个空单元格。其中两个始终是开始和结束单元格,另一个可以是任何剩余单元格。

计算从左上角到右下角的路径数量的部分非常简单,可以使用动态编程轻松解决。

我坚持的部分是要阻止的一个单元格以最小化路径数量。 Intuition表示要水平搜索网格,并使用最大数量的传入和传出路径阻止第一个单元格。例如,对于网格

..## -> Row 1
..##
....
.... -> Row 4

我会阻止(3,2),因为这会阻塞大部分路径,剩下的路径数量只有一个。但我并不完全相信这是正确的做法。任何见解?

1 个答案:

答案 0 :(得分:2)

  

计算从左上角到右下角的路径数量的部分非常简单,可以使用动态编程轻松解决

这个算法是一个很好的起点。考虑使用数组pathsFromStart[N][N]来存储从起点到(row, col)点的路径数的实现。再次运行算法,但现在从最后开始。这为您提供了第二个2D数组pathsFromFinish[N][N]

有了这两个阵列,您就可以找到原始问题的答案:如果(row,col)处的一个点有从前面开始的X路径,那么从终点开始通向它的Y路径,然后,通过删除该点将切割的路径总数将为XY。遍历网格上的所有点,不包括开始,结束和已被阻止的点,并使用

排除点
MAX(pathsFromStart[row][col]*pathsFromFinish[row][col])