Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找一个接班人,从左到右_C#_A Star - Fatal编程技术网

C# 找一个接班人,从左到右

C# 找一个接班人,从左到右,c#,a-star,C#,A Star,我在c中找到了一个方法来实现a*中节点的get succession# 首先,用户将在10x10网格中输入起始位置和目标位置 “获取继任者”方法将获取目标,然后为目标生成继任者,依此类推,直到到达起点 现在我的问题是,该方法采用对角后继节点“角点”,我只想得到上、下、左、右节点作为节点的后继节点。 这就是方法 public ArrayList GetSuccessors() { ArrayList successors = new ArrayList ();

我在c中找到了一个方法来实现a*中节点的get succession# 首先,用户将在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;
    }
public ArrayList getsuccessivers()
{
ArrayList继承者=新的ArrayList();

对于(int xd=-1;xd您的嵌套循环将对x和y坐标采用-1,0,1的每个组合,其中包括对角线值(以及(0,0)处的当前节点),这也应该避免。手动检查所需的4个基本方向可能比尝试循环更容易

要做到这一点,只需使用内部的if块,并对想要的(0,1)、(1,0)、(-1,0)和(0,-1)的xd和yd的4个组合重复它。您可以将此块重构为一个函数,以缩短代码,这样就不会重复太多代码

            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);

            }

当前,您的
for
循环将遍历所有9个可能的操作(沿8个可能的方向移动并保持放置)。 在第二个
for
循环中添加
if
语句,该语句将忽略您不想要的移动。如下所示:

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);

        }
    }
}

<代码> >(int xd=-1;xd感谢您回答),请给我一个示例,如何手动检查?请按要求更新。谢谢,谢谢您的工作:D,我只是修改您所说的“我真的欣赏”,您可能想考虑使用<代码>列表<代码>,而不是<代码> ARAYLIST/<代码>。