对于我的学校项目我使用A *算法制作2D平铺地图,以找到通过障碍物的最短路径。我使用了一个公式来为http://www.growingwiththeweb.com/2012/06/a-pathfinding-algorithm.html
的下一个图块获取启发式分数这是获取启发式的功能
bool matching_brackets(char p1, char p2)
{
return (p1 == '(' && p2 == ')')
|| (p1 == '{' && p2 == '}')
|| (p1 == '[' && p2 == ']');
}
// ...
if(s.at(i)==y.at(j))
{
if (list.empty())
{
v = 0;
error_position = i + 1;
}
else if (matching_brackets(list.back(), s.at(i)))
{
v = 1;
list.pop_back();
}
else
{
error_position = i + 1;
}
}
// ...
当y轴上的起点高于终点时,这是有效的,但是当y轴上的起点较低时,它没有找到最有效的路径。
我已经添加了我的问题的控制台版本。最有效的应该是对角线上升,但它需要一条错误的路径。
(蓝色' C'是选中的节点,绿色' P'路径制作,红色' N'仍有待检查,其他尚未到达)
答案 0 :(得分:0)
差异周围的管道符号|
是absolute value function,这在C#中表示为Math.Abs
。
距离没有附加标志。当cx - ex
大于ex
时(cx
同样cy - ey
),Math.Min
和Math.Max
可能会导致d_min
选择d_max
和Math.Abs
的维度错误。您应该使用 int d_min = Math.Min(Math.Abs(cx - ex), Math.Abs(cy - ey));
从正在比较的数量中删除符号。
e.g。
d_max
(同样适用于tolower
。)