我在c#中找到一个方法实现获取A *中节点的后继 首先,用户将在10x10网格中输入起始位置和目标位置 方法获得后继者将获得目标,然后生成目标的后继者等等,直到它到达开始 我现在的问题是该方法采用对角线后继“角落”,我想只将上,下,左,右节点作为节点的后继节点。 这个方法
public ArrayList GetSuccessors()
{
ArrayList successors = new ArrayList ();
for (int xd=-1;xd<=1;xd++)
{
for (int yd=-1;yd<=1;yd++)
{
if (Map.getMap (x+xd,y+yd) !=-1)
{
Node n = new Node (this,this._goalNode ,Map.getMap (x+xd,y+yd) ,x+xd,y+yd);
if (!n.isMatch (this.parentNode) && !n.isMatch (this))
successors.Add (n);
}
}
}
return successors;
}
假设我输入x = 0,y = 0作为开始 x = 5,y = 2作为目标
它将从目标位置开始 这将是x = 4,y = 1作为对角节点的第一个继承者!!
我知道问题出现在循环条件上,我如何修改条件以仅采用向左下方的后继条件。 不要担心getMab它只返回节点有1或-1,如果它是一个障碍。
谢谢
答案 0 :(得分:1)
您的for
循环当前遍历所有9个可能的操作(向8个可能的方向移动并保持不变)。
在第二个if
循环中添加for
语句,忽略您不想要的移动。像这样:
for (int xd=-1;xd<=1;xd++)
{
for (int yd=-1;yd<=1;yd++)
{
// you want only up, down, left, or right moves
// those are if one of xd or yd == 0
if ((xd != 0 && yd != 0) || (xd == 0 && yd == 0))
continue;
if (Map.getMap (x+xd,y+yd) !=-1)
{
Node n = new Node (this,this._goalNode ,Map.getMap (x+xd,y+yd) ,x+xd,y+yd);
if (!n.isMatch (this.parentNode) && !n.isMatch (this))
successors.Add (n);
}
}
}
答案 1 :(得分:0)
对于x和y坐标,你的嵌套循环将采用-1,0,1的每个组合,其中包括对角线值(以及(0,0)处的当前节点,这也应该避免。)可能更容易手动检查你想要的4个基本方向而不是试图循环。
要做到这一点,只需取出你的内部if块并重复它为你想要的xd和yd的4种组合(0,1),(1,0),( - 1,0)和(0, - 1)。你可以将这个块重构为一个函数来缩短代码,这样你就不会重复代码了。
if (Map.getMap (x+xd,y+yd) !=-1)
{
Node n = new Node (this,this._goalNode ,Map.getMap (x+xd,y+yd) ,x+xd,y+yd);
if (!n.isMatch (this.parentNode) && !n.isMatch (this))
successors.Add (n);
}