我最近一直在尝试使用教程here在Javascript中实现Dijkstra的算法。我能够成功绕过障碍物,但它所做的路径根本不是最佳的,通常是非常直的。我认为问题在于他如何实现寻找邻居。他的代码似乎以接近随机的顺序挑选邻居,而我的代码总是以固定顺序选择它们,所以这可能是一个好看的地方。我不能为我的生活弄清楚。我尝试了我能想到的一切。
我的填充实现是:
function floodFill(array,sx,sy,dx,dy){
var frontier=[[sx,sy]];
array[sy][sx].visited=true;
var look=[[-1,0],[0,-1],[1,0],[0,1]];
var looks=0;
while(frontier.length>0){
if(frontier.length>0){
var current=frontier[0];
frontier.splice(0,1);
if(current[0]==dx && current[1]==dy){
console.log("Broke early!");
break;
}
for(var i=0;i<look.length;i++){
var y=current[0]+look[i][0];
var x=current[1]+look[i][1];
if((y>=0 && y<array[current[0]].length) && (x>=0 && x<array.length)){
if(array[y][x].visited==false && array[y][x].type==0){
frontier.push([y,x]);
looks++;
array[y][x].visited=true;
array[y][x].origin=[current[0],current[1]];
array[y][x].order=looks;
}
}
}
}
}
}
你可以找到一个演示here(你需要打开你的javascript控制台才能看到它)
非常感谢你的时间。
这是我的问题的图像
答案 0 :(得分:0)
找出答案。简单地说,当我找到邻居时,我没有检查对角线。
You can find a working version here
我改变的部分
var look=[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];