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