Javascript 使用寻路网格生成的边情况很困难

Javascript 使用寻路网格生成的边情况很困难,javascript,arrays,algorithm,path-finding,a-star,Javascript,Arrays,Algorithm,Path Finding,A Star,我正在尝试开发一个实现,用于支持可能大于单个单元的单元的A-star路径查找 我遇到的问题是,目前我的输出中有一个小错误,我不确定我是否实现了它,或者该算法是否不能正确处理这种边缘情况 下面是一个完整的复制品,演示了这个问题: 函数createThickGrid(inputGrid、宽度、高度){ 让outputGrid=[]; 设大整数=100000000; for(设i=0;i

我正在尝试开发一个实现,用于支持可能大于单个单元的单元的A-star路径查找

我遇到的问题是,目前我的输出中有一个小错误,我不确定我是否实现了它,或者该算法是否不能正确处理这种边缘情况

下面是一个完整的复制品,演示了这个问题:

函数createThickGrid(inputGrid、宽度、高度){
让outputGrid=[];
设大整数=100000000;
for(设i=0;i0){
outputGrid[i]=getSmallestNeighbor(outputGrid,i,宽度,高度)+2;
}
}
返回输出网格;
}
函数getSmallestNeighbor(网格、idx、宽度、高度){
设col=idx%宽度;
let row=数学地板(idx/宽度);
设最小值=99999999;
如果(行=高度-1 | |列=宽度-1){
返回-1;
}
设northValue=网格[idx-宽度];
如果(值<最小值){
最小值=最大值;
}
设northWestValue=grid[idx-宽度-1];
if(西北值<最小值){
最小值=西北值;
}
设northEastValue=grid[idx-宽度+1];
if(东北值<最小值){
最小值=东北值;
}
设southValue=网格[idx+宽度];
if(值<最小值){
最小值=最小值;
}
设southWestValue=栅格[idx+宽度-1];
if(西南值<最小值){
最小值=西南值;
}
设值=网格[idx+宽度+1];
如果(值<最小值){
最小=最小值;
}
设westValue=grid[idx-1];
如果(值<最小值){
最小值=最小值;
}
设eastValue=grid[idx+1];
if(值<最小值){
最小值=最小值;
}
返回最小;
}
//你可以忽略这一点,这只是为了漂亮的印刷
函数转换1到2(网格、宽度、高度){
设arr=[];
for(让行=0;行<高度;行++){
设newRow=[];
for(设col=0;colconsole.log(convert1DTo2D(thickGrid,width,height))事实上,您的算法不会那样工作。更新距离时,这可能会影响已处理单元的距离(北),该距离应根据当前单元刚获得的距离减小

解决这个问题的一个算法是面包优先遍历:这将使您按距离的顺序访问单元格。所以你从墙开始,找到他们的邻居,把他们排在队伍的最后。从队列开始处理单元格。这样,您将找到从墙到任何单元的最短路径,并可以正确确定它们之间的距离

有几种方法可以实现这种广度优先遍历。我个人喜欢使用两个普通数组,而不是单个队列。每次将所有邻居添加到一个数组中时,都会使该数组成为下一次迭代的基础,其中距离将大2倍。下一次迭代将用邻居填充一个新数组。在该迭代结束时,新数组将被视为旧数组,所有内容都将重复,直到找不到更多的邻居:

函数createThickGrid(inputGrid,宽度){ let height=inputGrid.length/width;//可以导出高度。。。 让outputGrid=[]; //将所有墙添加到列表中 let wave=[-1];//表示网格外“墙”的特殊墙值 for(设i=0;i=0){//正常情况 如果(i%width)相邻。推(i-1-width,i-1,i-1+width); 推(i-宽度,i+宽度); 如果((i+1)%width)相邻,则按(i+1-width,i+1,i+1+width); }否则{//所有边缘单元都与“墙”相邻 邻居=[…数组(宽度).keys(), …数组。从({length:height-2},(u,i)=>(i+1)*宽度), …数组.from({length:height-2},(u,i)=>(i+2)*width-1), …数组.from({length:width},(u,i)=>(高度-1)*宽度+i) ]; } 返回邻居。筛选器(i=> i>=0&&i gr