簡體   English   中英

迷宮不循環的 BFS 算法 - Javascript

[英]BFS algorithm for maze not looping - Javascript

我正在嘗試使用 BFS 算法來解決迷宮,我已將其表示在一個數組中,其中除中心(目標)為 0 外,所有元素都從 999 開始。我試圖讓代碼從 0 開始並分支出來四種方式(北/南/東/西),如果數字大於父級,則在父級數字上加 1。 初始循環的中間應該有一個 0,四個相鄰的單元格應該從 999 更新為 1。這應該循環直到算法到達位置 0,0。 不幸的是,我似乎無法讓循環運行 - 我可以將前四個元素更新為 1,然后它就停止了。 我認為這與我的隊列如何/不被作為下一個循環的 (y,x) 輸入拾取有關,但我似乎無法改變這一點。 這是一項任務,因此不是在尋找解決方案,而是在幫助我了解循環中缺少什么方面的任何幫助將不勝感激。 我已經在下面展示了數組代碼(迷宮)和 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);

我認為您可能在這一行中遇到問題:

queue.shift()

似乎您從未讀取存儲在隊列中的值,因此循環中的坐標從未更新,這意味着您始終檢查相同的位置。 您可能希望將queue.shift()的值分配給一個變量並使用這些坐標繼續搜索。

只是這樣做:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM