我们在2D平面上给出了一组N个点,我们必须找到一个路径,它按照1-2-3 ...... N的顺序访问所有点,然后返回到1,这样就可以节省时间最小化。我们可以向北,东,西或南移动一步,需要1个单位时间。除了1之外我们不能多次访问N点中的一个,我们不能访问超过两次。
N <= 100
每个点的x和y轴是&lt; = 1000000
(This是过去USACO比赛中出现的完整问题陈述)
点的x和y轴可以非常大但是只有&lt; = 100点所以,我们改变点的x轴,这样当它们按x轴的升序排列时,它们之间的差异相邻点的x轴为1.对于点的所有y轴,我们都这样做。
现在我们找到从点1到2,从2到3,......以及从N到1的最短路径,而不访问除源和目标之外的任何给定点。我们不能使用简单的bfs来找到最短路径,因为从点x,y到点x + 1,y的距离不是1,而是x + 1的原始值减去x的原始值。所以我使用Dijktra的算法和二进制堆来找到最短的路径。
但是这个算法不适用于testcases的一半,它输出的解决方案大于正确的解决方案。
为什么这个算法错了?我们怎么解决这个问题?
答案 0 :(得分:2)
点的x和y轴可以非常大但是只有&lt; = 100点所以,我们改变点的x轴,这样当它们按x轴的升序排列时,它们之间的差异相邻点的x轴为1.对于点的所有y轴,我们都这样做。
这实质上意味着您删除“未使用”的坐标。但这将耗费你的操作空间。请看以下示例:
4
1 1
3 3
3 2
1 2
这里最短的路径需要8个步骤。假设正x为东,正y为北,则最佳路径为ennESwWS
,大写字母表示到达下一个农场。
/--2
| |
4--|--3
| |
1--/
现在,如果您执行压缩方案,那么您将删除y = 2列,实际上将没有任何列,您可以从农场1传递到农场2,而无需访问农场3或4.所以我看到这种压缩没有收获,但很麻烦。
所以我使用了Dijktra的算法
在什么图表上?如果您只在农场使用Dijkstra,那么您将遇到麻烦,因为您必须考虑非农场位置。如果你也采取这些措施,就我所见,事情应该有效。除了前面的压缩。
如果你想保持这个想法,可以做的是将空行或列的连续范围压缩成一个。这样,您的图表将保持相当小(最多201行和每列),但是如果农场周围有空间,那么您的图表将代表这一事实。
我想我会为Dijkstra使用“绕道度量”:让你更接近距离的每一步都是零成本,而带走你的每一步都要花费一个。最后,您可以考虑绕道费用,乘以2(因为您带走的每一步也是您必须朝着目标迈出的一步)并添加终点的曼哈顿距离(这是零迂回成本) )你回来了原来的费用。这基本上是来自A *的想法,但是与Disjkstra的性能(和现有实现)有关。
答案 1 :(得分:1)
如果你压缩这个
..2
...
3.4
...
1..
到这个
.2
34
1.
然后你将路径的长度从1增加到2,因为34构成了一个虚假的障碍。您可以将多个空行/列压缩为一个空行/列而不是无。
答案 2 :(得分:1)
我的想法是:从点i
到点i + 1
的距离何时不是曼哈顿距离?在我看来,唯一的情况是有一个完整的水平或垂直块(或两者),例如,
(i+1) X (i+1) (i+1)
X
XXX XXXX X XXXX
X X X
i i X i X
我还没有编码任何东西,但也许在计算到下一个点的路线时扫描任一块是有用的,如果块存在则计算最小绕道。