Javascript算法-网格中线条笔划最少的路径

Javascript算法-网格中线条笔划最少的路径,javascript,path-finding,Javascript,Path Finding,我正在编写javascript代码,其中输入是网格、起始位置和目标位置。 f、 e 我需要在起点和终点之间找到一条线划最少的路径。在本例中,它将是[1,1][1,2][1,3][2,3][3,3][4,3][4,4],因此只有三个线条笔划。我尝试了bfs(),但它没有得到最少笔划数的路径。我认为Dijkstra的算法,使用bfs应该在这里工作。您可以使用典型的bfs图算法,但是当节点彼此之间有一个笔划分离时,它们被认为是邻居 这里有一种编码方法: 功能bfs(网格、开始、结束){ 让comeF

我正在编写javascript代码,其中输入是网格、起始位置和目标位置。 f、 e


我需要在起点和终点之间找到一条线划最少的路径。在本例中,它将是[1,1][1,2][1,3][2,3][3,3][4,3][4,4],因此只有三个线条笔划。我尝试了bfs(),但它没有得到最少笔划数的路径。

我认为Dijkstra的算法,使用bfs应该在这里工作。

您可以使用典型的bfs图算法,但是当节点彼此之间有一个笔划分离时,它们被认为是邻居

这里有一种编码方法:

功能bfs(网格、开始、结束){
让comeFrom=新地图;
comeFrom.set(网格[end[0],end[1]],null);//将开始标记为已访问
让frontier=[开始];
while(边界长度){
让nextFrontier=[];
for(让边界节点){
//对于4个方向中的每个方向:
for(设[-1,0],[0,-1],[1,0],[0,1]]的[dr,dc]{
设[r,c]=[node[0]+dr,node[1]+dc];
//尽可能朝同一方向继续
while(grid[r]?[c]?.state==“empty”&&!comeFrom.has(grid[r][c])){
//登记我们从哪里来
comeFrom.set(grid[r][c],节点);
如果(r==end[0]&&c==end[1]){//找到了目标
//从comeFrom信息构建路径
让路径=[end];
而(r!==开始[0]| | c!==开始[1]){
[r,c]=comeFrom.get(grid[r][c]);
路径推送([r,c]);
}
返回路径:reverse();
}
下一个前推([r,c]);
r+=dr;
c+=dc;
}
}
}
我们没有在这个笔画中找到目标。
前沿=下一个前沿;
}
}
//演示
设网格=[
[{state:'block'},{state:'block'},{state:'block'},{state:'empty'}],
[{state:'block'},{state:'empty'},{state:'empty'},{state:'block'},
[{state:'block'},{state:'empty'},{state:'empty'},{state:'empty'},{state:'empty'}],
[{state:'empty'},{state:'block'},{state:'empty'},{state:'block'},
[{state:'empty'},{state:'empty'},{state:'block'},{state:'empty'},{state:'empty'}],
[{state:'empty'},{state:'empty'},{state:'block'},{state:'empty'},{state:'empty'}],
];
让我们开始=[1,1];
设end=[4,4];
让路径=bfs(网格、开始、结束);

log(JSON.stringify(path))我想稍微多一些细节会使这成为一个很好的答案——甚至是Dijkstra代码示例,与代码无关,我也不会意识到我可以实现BFS,并考虑将节点以一个笔划分隔为邻居。我认为两个相邻的元素是邻居。非常好的解决方案,谢谢+1.
let grid = 

[
  [{ state: 'block' }, { state: 'block' }, { state: 'block' }, { state: 'block' }, { state: 'empty' }],
  
  [{ state: 'block' }, { state: 'empty' }, { state: 'empty' }, { state: 'empty' }, { state: 'block' }],
  
  [{ state: 'block' }, { state: 'empty' }, { state: 'empty' }, { state: 'empty' }, { state: 'empty' }],
  
  [{ state: 'empty' }, { state: 'block' }, { state: 'empty' }, { state: 'empty' }, { state: 'block' }],

  [{ state: 'empty' }, { state: 'empty' }, { state: 'block' }, { state: 'empty' }, { state: 'empty' }],

  [{ state: 'empty' }, { state: 'empty' }, { state: 'empty' }, { state: 'block' }, { state: 'empty' }],
];

let start = [1,1];

let end = [4,4];