Javascript 具有可追踪路径的二维网格上的BFS

Javascript 具有可追踪路径的二维网格上的BFS,javascript,algorithm,multidimensional-array,breadth-first-search,Javascript,Algorithm,Multidimensional Array,Breadth First Search,这个问题可能很熟悉,但有一点扭曲。我有一个网格(2D阵列),带有可能的标记: “?”-未勘探 “—”可步行 “#”-墙 “G”-目标 每次我朝某个方向走(没有对角线),我都会发现周围有5x5个区域。在我发现“G”之后,我必须找到到达起点的最短路径 所以我在两种情况下都尝试BFS。它似乎在一个方向的简单路径上工作,如: ????#### ????..S# ????#### ???????? ???????? 其中地图看起来像: ######## #.....S# #.###### #..

这个问题可能很熟悉,但有一点扭曲。我有一个网格(2D阵列),带有可能的标记: “?”-未勘探 “—”可步行 “#”-墙 “G”-目标

每次我朝某个方向走(没有对角线),我都会发现周围有5x5个区域。在我发现“G”之后,我必须找到到达起点的最短路径

所以我在两种情况下都尝试BFS。它似乎在一个方向的简单路径上工作,如:

????####
????..S#
????####
????????
????????
其中地图看起来像:

 ########
 #.....S#
 #.######
 #......#
 ########
但有时当我有很多可能去的时候,它会被卡住。它找到“最近的”(不确定那个)”?“符号,返回路径,我从这一点再次转到第一个坐标和BFS。但当我朝那个方向走的时候,我有时会被卡住,BFS,算法在相反的方向找到“更近的”?,然后我来回走

我认为我的算法有问题,因为为左/右返回的路径与3-4个节点不同

function BFS(position,map,checked,target,avoid){
    var Q = [[new Node(position.x,position.y)]];
    var Path;
    d=0;
    while(Q.length >0){
        Path = Q.shift();
        vertex = Path[Path.length-1];

        if(Map[vertex.y][vertex.x] == target){
            return Path;
        }

        else if(checked[vertex.y][vertex.x] == 0){

            if(vertex.x+1<C && Map[vertex.y][vertex.x+1] !="#" && checked[vertex.y][vertex.x+1] == 0){
                new_path = Path.slice();
                new_path.push(new Node(vertex.x+1,vertex.y));
                Q.unshift(new_path);
            }
            if(vertex.x+1<C && Map[vertex.y][vertex.x+1] == "G"){
                G_discovered = true;
                G_position = new Node(vertex.x+1, vertex.y);
            } 


            if(vertex.y+1<R && Map[vertex.y+1][vertex.x] !="#" && checked[vertex.y+1][vertex.x] == 0){
                new_path = Path.slice();
                new_path.push(new Node(vertex.x,vertex.y+1));
                Q.unshift(new_path);
            }
            if(vertex.y+1<R && Map[vertex.y+1][vertex.x] == "G"){
                G_discovered = true;
                G_position = new Node(vertex.x, vertex.y+1);
            } 



            if(vertex.x-1>=0 && Map[vertex.y][vertex.x-1] !="#" && checked[vertex.y][vertex.x-1] == 0){
                new_path = Path.slice();
                new_path.push(new Node(vertex.x-1,vertex.y));
                Q.unshift(new_path);
            }
            if(vertex.x-1>=0 && Map[vertex.y][vertex.x-1] == "G" ){
                G_discovered = true;
                G_position = new Node(vertex.x-1, vertex.y);
            } 

            if(vertex.y-1>=0 && Map[vertex.y-1][vertex.x] !="#" && checked[vertex.y-1][vertex.x] == 0){
                new_path = Path.slice();
                new_path.push(new Node(vertex.x,vertex.y-1));
                Q.unshift(new_path);
            }
            if(vertex.y-1>=0 && Map[vertex.y-1][vertex.x] == "G"){
                G_discovered = true;
                G_position = new Node(vertex.x, vertex.y-1);
            }
            d++;
            checked[vertex.y][vertex.x] = 1;
        }
    }
    return "no path found"
}
功能BFS(位置、地图、选中、目标、避免){
var Q=[[新节点(position.x,position.y)];
var路径;
d=0;
而(Q.length>0){
路径=Q.shift();
顶点=路径[路径长度-1];
if(映射[vertex.y][vertex.x]==目标){
返回路径;
}
else if(选中[vertex.y][vertex.x]==0){
if(vertex.x+1=0&&Map[vertex.y-1][vertex.x]=“G”){
G_=true;
G_位置=新节点(顶点.x,顶点.y-1);
}
d++;
选中的[vertex.y][vertex.x]=1;
}
}
返回“未找到路径”
}

我在map对象中读取map的每一步以及清除选中数组的每一步都是传递给函数的参数
map
,与
map
相同?是的,它们是相同的。它在每次移动(每次BFS呼叫)之前都会更新。请您再描述一下“场景”这个术语好吗?我认为问题可能在于,shift从一开始就获取元素,而unshift则将元素添加到一开始。因此,基本上是后进先出(DFS)行为,而不是先进先出(FIFO)。难道你不能简单地浏览整个映射,然后计算最短路径吗?传递给函数的参数
map
是否与
map
相同?是的,它们是相同的。它在每次移动(每次BFS呼叫)之前都会更新。请您再描述一下“场景”这个术语好吗?我认为问题可能在于,shift从一开始就获取元素,而unshift则将元素添加到一开始。所以你基本上有一个后进先出的行为(DFS),而不是先进先出的行为。你不能简单地浏览整个地图,然后计算最短路径吗?