迷宫不循环的BFS算法-Javascript

时间:2020-09-14 09:39:22

标签: javascript breadth-first-search maze

我正在尝试使用BFS算法来解决迷宫,我在一个数组中表示了迷宫,其中所有元素都以999开始,但中心(目标)为0。我试图使代码从0开始并划分出四种方式(北/南/东/西),如果该数字大于父数字,则在父数字上加1。初始循环的中间应该为0,并且四个相邻的像元应该从999更新为1。这应该循环直到算法到达位置0,0。不幸的是,我似乎无法运行循环-我可以将前四个元素更新为1,然后停止。我认为这与我的队列是/不被下一个循环的(y,x)输入有关,但是我似乎无法改变它。 这是一项任务,因此不要寻求解决方案,但会非常感谢您在帮助我了解循环中缺少的任何帮助。我在下面显示了数组代码(mazeD)和BFS /洪水代码

// maze array showing numerical distance
let mazeD = [];
for (let y = 0; y < 10; y++) {
  let row = [];
  for (let x = 0; x < 10; x++) {
    row[x] = 999;
  }
  mazeD[y] = row;
}

mazeD[5][5] = 0;

// BFS function
function flood(x, y, d) {
  let queue = []
  queue.push([y, x]);
  while (queue.length > 0) {
    queue.shift();
    let fillArr = [
      [+y - 1, +x],
      [+y, +x - 1],
      [+y, +x + 1],
      [+y + 1, +x],
    ];
    if ((x < 10) && (y < 10)) {
      d++;
      for (let [yy, xx] of fillArr) {
      if (mazeD[yy][xx] > d) {
        queue.push([yy, xx]);
        mazeD[yy][xx] = d;
        console.log("queue =" +queue)
      }
    } 
  }
 }
}
flood(5, 5, 0);
console.log(mazeD);

2 个答案:

答案 0 :(得分:0)

我认为您可能在此行中遇到问题:

queue.shift()

似乎您永远不会读取存储在队列中的值,因此循环中的坐标永远不会更新,这意味着您始终在检查相同的位置。您可能希望将queue.shift()的值分配给变量,然后使用这些坐标继续搜索。

答案 1 :(得分:0)

只要这样做:

let mazeD = [];
for (let y = 0; y < 10; y++) {
  let row = [];
  for (let x = 0; x < 10; x++) {
    row[x] = 999;
  }
  mazeD[y] = row;
}

mazeD[5][5] = 0;

// BFS function
function flood(x, y, d) {
  let queue = [];
  let i = 0;
  queue.push([y, x]);

  while (i < queue.length) {
    
    [x,y] = queue[i,i];
    let fillArr = [
      [+y - 1, +x],
      [+y, +x - 1],
      [+y, +x + 1],
      [+y + 1, +x],
    ];
    if ((x < 10) && (y < 10) && x >=0 && y>=0) 
    {
      for (let [yy, xx] of fillArr) 
      {
        
      if(yy >=0 && yy < 10 && xx>=0 && xx<10)
      {
          if (mazeD[yy][xx] == 999) 
          {
            queue.push([yy, xx]);
            mazeD[yy][xx] = mazeD[y][x]+1;
            console.log(xx,yy,mazeD[y][x]+1);
          }
          if(xx == 0 && yy == 0){
            return;
          }
      }
      
    } 
  
   }
   i++;
  }
}
flood(5, 5, 0);
console.log(mazeD);