本文整理汇总了C#中System.Collections.Generic.PriorityQueue.HeapifyUp方法的典型用法代码示例。如果您正苦于以下问题:C# PriorityQueue.HeapifyUp方法的具体用法?C# PriorityQueue.HeapifyUp怎么用?C# PriorityQueue.HeapifyUp使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Collections.Generic.PriorityQueue
的用法示例。
在下文中一共展示了PriorityQueue.HeapifyUp方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: FindPath
public static List<Position> FindPath( Engine engine, Unit unit, Tile start, Tile end )
{
List<Position> path = null;
if (!unit.CanMove(end.position))
{
foreach (Position pos in BreadthFirst(engine, end.position, -1, 500))
{
if (unit.CanMove(pos))
{
end = engine.map.tiles[pos.x, pos.y];
break;
}
}
}
if (!unit.CanMove(end.position))
{
return null;
}
bool success = false;
start.pathParent = null;
start.pathDistance = 0;
start.pathHeuristic = start.pathDistance + FValue(start, end);
PriorityQueue<Tile> openSet = new PriorityQueue<Tile>();
openSet.Enqueue(start);
int count = 0;
//generate path
while ( openSet.Count() > 0 )
{
count += 1;
Tile currentBest = openSet.Dequeue();
currentBest.pathIndex = pathCounter;
// if we are at the goal end
if (currentBest.position.Equals(end.position))
{
success = true;
break;
}
// Give up if we backtrack too far
if ((currentBest.pathHeuristic >= start.pathHeuristic*14 &&
count > 2000) || count > 4000)
{
break;
}
// Take current best, generate all possible nodes, push them onto queue
foreach (var neighbor in currentBest.neighbors)
{
if (!unit.CanMove(neighbor.position))
{
continue;
}
double tentativeCost = currentBest.pathDistance + neighbor.tileType.movementCost;
if (neighbor.pathIndex < pathCounter)
{
neighbor.pathIndex = pathCounter;
neighbor.pathParent = currentBest;
neighbor.pathDistance = tentativeCost;
neighbor.pathHeuristic = neighbor.pathDistance + FValue(neighbor, end);
openSet.Enqueue(neighbor);
}
else if (tentativeCost < neighbor.pathDistance)
{
// Update costs if the current path is better than the existing one
neighbor.pathParent = currentBest;
neighbor.pathDistance = tentativeCost;
neighbor.pathHeuristic = neighbor.pathDistance + FValue(neighbor, end);
openSet.HeapifyUp(neighbor);
}
}
}
if ( success )
{
// Generate path by following parent from end to start
path = new List<Position>();
Tile runner = end;
while (runner != null)
{
path.Insert(0, runner.position);
runner = runner.pathParent;
}
}
pathCounter += 1;
return path;
}