C++ TopCoder";“逃避”;解决方案混乱

C++ TopCoder";“逃避”;解决方案混乱,c++,algorithm,breadth-first-search,C++,Algorithm,Breadth First Search,这是TopCoder竞赛中使用的问题。我了解大多数解决方案,它基本上在任何时间点跟踪特定节点的最佳解决方案,并且在到达目标节点后,可以将最佳解决方案输出到该节点。然而,这个解决方案使用BFS,我很困惑,因为它似乎可以多次访问同一个节点,所以我只是试图理解代码是如何工作的。我知道存在终止条件,但我们如何确保目标将持有最佳解决方案,并且,如果BFS过程没有“已访问”数组,我们如何确保代码实际上将终止(即使存在终止条件)?我在下面附上了问题陈述和解决方案 问题陈述 你正在玩一个涉及逃跑的电子游戏 从一

这是TopCoder竞赛中使用的问题。我了解大多数解决方案,它基本上在任何时间点跟踪特定节点的最佳解决方案,并且在到达目标节点后,可以将最佳解决方案输出到该节点。然而,这个解决方案使用BFS,我很困惑,因为它似乎可以多次访问同一个节点,所以我只是试图理解代码是如何工作的。我知道存在终止条件,但我们如何确保目标将持有最佳解决方案,并且,如果BFS过程没有“已访问”数组,我们如何确保代码实际上将终止(即使存在终止条件)?我在下面附上了问题陈述和解决方案

问题陈述

你正在玩一个涉及逃跑的电子游戏 从一个危险的地方。在这个区域内有一些致命的区域 无法进入有害区域,每迈出一步就要付出1次生命 在他们,和正常的区域,不会影响你的任何方式。你会 从(0,0)开始,仅使用Up、Left、, 对,然后下台阶。地图将以字符串形式给出 列出致命区域和字符串[]有害列出有害区域 区域。每个参数中的元素都将格式化为 如下:

输入格式(为清楚起见,引号):“X1-Y1-X2-Y2”,其中(X1,Y1)是区域的一个角,(X2,Y2)是区域的另一个角

区域的角是包含边界(即(4,1)和(2,2) 包括介于4和2之间(含4和2)的x值和介于1和2之间的y值 (包括2项)。所有未指定区域均视为正常。如果 区域为特定的正方形重叠,然后选择哪个区域为 最坏的效果(例如致命+有害=致命,有害+正常= 有害,有害+有害=有害,致命+正常=致命)

每一步所造成的伤害都是基于目标方和目标方而发生的 不在起始方块上(例如,如果方块(500500)有害 你踩上去会受到一点伤害;如果正方形(0,0) 是有害的,你不会受到一点伤害,离开它;这 类似地适用于致命方块)

尽可能少的付出你将不得不失去的生命 到达目的地。如果没有到的路径,则返回-1 目的地。您的角色不允许离开地图(即 X或Y小于0或大于500)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构节点
{
节点(int x,int y){x=x;y=y;}
int id()常量
{
返回y*501+x;
}
int x,y;
};
地图区;
布尔运算符x1>>y1>>x2>>y2;
清晰(x1,y1,x2,y2,1);
}
对于(i=0;i>x1>>y1>>x2>>y2;
清晰(x1,y1,x2,y2,2);
}
bfs(0,0);
节点端=节点(500500);
如果(!dist.count(end.id()))
返回-1;
其他的
返回距离[end.id()];
}
};
此行:

if (!dist.count(dest.id()) || dist[dest.id()] > dist[src.id()] + length)

是说“探索目标位置,如果它不在计算的距离地图中,或者如果我们找到一条新的更便宜的路径”。此条件确保BFS终止。

造成混淆的部分原因可能是命名错误的算法。“这不是一个广度优先搜索,它是Dijkstra算法的一个实现。”NickJohnson说实话,当我第一次读到这个问题时,我认为Dijkstra算法是可行的。但我在读一篇帖子,上面说要使用BFS,在看到解决方案中的函数名后,我认为这就是实现的算法。既然你已经澄清了,这就更有意义了。谢谢。Dijkstra算法和BFS本质上是一样的。(投票关闭的ppl很奇怪)@MK不是真的-Dijkstra算法可以导致显著不同的访问顺序,并支持权重。它们的相似之处在于它们都是图遍历算法。
if (!dist.count(dest.id()) || dist[dest.id()] > dist[src.id()] + length)