我在算法中被困了 4 天。我正在开发麻将 Safari 类型的游戏(http://www.pogo.com/games/mahjongsafari),我想在两个瓷砖之间开发路径,并且瓷砖数量最少。
我已经在曼哈顿 Hueristic 中应用了 A* 算法,但它会生成有很多转弯的最短路径。不需要最短路径,我只需要最小转弯的路径(最好是2)。下面是来自 Mahjong Safari 游戏的图像,它在 2 个磁贴之间生成路径。您会注意到从 A 到 B 的路径和从 B 到 A 的路径是不同的。
请以任何代码或任何算法名称或任何您认为可行的逻辑帮助我。
编辑:我申请的解决方案:
我首先使用真正的 A* 算法来寻找最短路径,并使用曼哈顿距离作为启发式目标估计。为了使路径更直,并选择转弯次数最少的路径,我在每次迭代中使用了以下策略:
Tile first = currentNode.parent;
Tile curr = currentNode;
Tile last = successorOfCurrentNode;
if (first != null)
{
if ((first.X == curr.X && first.Y != curr.Y) && (curr.Y == last.Y && curr.X != last.X))
{
// We got turn
currentNode.Cost += 10;
currentNode.calcuateTotalCost();
successorOfCurrentNode.Cost += 5;
successorOfCurrentNode.calcuateTotalCost();
}
else if ((first.X != curr.X && first.Y == curr.Y) && (curr.X == last.X && curr.Y != last.Y))
{
// We got turn
currentNode.Cost += 10;
currentNode.calcuateTotalCost();
successorOfCurrentNode.Cost += 5;
successorOfCurrentNode.calcuateTotalCost();
}
}