假设你有一个带骑士,公主和退出的NxN迷宫。
还有一个邪恶的巫婆计划阻挡M
方格(将它们置于火上)。在骑士第一次移动之前,她将把所有这些块都置于火上(他们不交替转弯)。
鉴于到迷宫的地图和M,你能否在O(N ^ 2)中决定骑士是否能够到达公主,然后是出口,因为女巫可以选择任何方块(意思是 - 女巫可以做出选择,阻止骑士和公主逃跑吗?
答案 0 :(得分:4)
这个问题似乎等同于确定从骑士到公主是否存在M + 1
个不同路径,以及从公主到出口的M + 1
个不同路径。如果从骑士到公主(或公主退出)只有M
个不同的路径,女巫可以从每条路径烧掉一个方格,阻止救援(唉,任何幸福的机会) - 他们之间的恋情。)
例如,你问题中的迷宫有两条从骑士到公主的不同路径,以及从公主到出口的两条不同路径。因此,可以燃烧min(2, 2)
以防止逃跑。
使用maximal network flow算法可以找到两点之间不同路径的数量。网格中的每个单元是网络中的节点;如果两个节点相邻并且都是白色的,则它们具有连接它们的边缘(容量为1)。从一个点到另一个点的最大网络流量表示它们之间的不同路径的数量。
Ford Fulkerson algorithm将在O(E * f)
时间内解决网络流量问题,其中E
是网络中的边数(最多N^2
)和{{1}是最大网络流量的值。因为最大网络流量最多为4(骑士的第一次移动只有四个可能的方向),所以总复杂度根据要求变为f
。
避免多次使用节点
正如其他人所指出的,上述解决方案可防止 edge 多次进出节点;不是节点本身。
我们可以通过为每个单元提供四个输入边,一个保护边和四个输出边(每个重量为1)来修改流图以避免节点被多次使用如下:
一个单元格的输出边缘对应另一个单元格的输入。现在每个单元只能用于一条路径,因为保护边缘的流量只能为1.接收器和源单元保持不变。我们每个单元的边数仍然是恒定的,这使算法的复杂性保持不变。