在JavaScript中实现递归回溯?

在JavaScript中实现递归回溯?,javascript,algorithm,graph-algorithm,maze,Javascript,Algorithm,Graph Algorithm,Maze,我有一个二维数组,里面充满了对象。我想将这个数组转换成一个迷宫,其中一些对象是墙(它们有一个应标记为true的isWall属性),一些对象是通道(isWall将为false) 我试图使用(我使用的是堆栈,而不是递归)来实现这一点,但我的迷宫是这样显示的 黑色方块代表墙壁,而白色方块代表通道。白色方块中的数字是不相关的(只是我用于Djikstra的权重) 下面是我在JavaScript中实现的递归回溯 JavaScript function isValid(r, c, grid) { if

我有一个二维数组,里面充满了对象。我想将这个数组转换成一个迷宫,其中一些对象是墙(它们有一个应标记为true的
isWall
属性),一些对象是通道(
isWall
将为false)

我试图使用(我使用的是堆栈,而不是递归)来实现这一点,但我的迷宫是这样显示的

黑色方块代表墙壁,而白色方块代表通道。白色方块中的数字是不相关的(只是我用于Djikstra的权重)

下面是我在JavaScript中实现的递归回溯

JavaScript
function isValid(r, c, grid) {
  if (r < 0 || c < 0) {
    return false;
  }
  if (r < grid.length && c < grid[r].length) {
    return true;
  }
  return false;
}

export default function recursiveBacktracker(grid, startNode, endNode) {

  // Fill Grid with walls
  for (let r = 0; r < grid.length; r++) {
    for (let c = 0; c < grid[r].length; c++) {
      grid[r][c].isWall = true;
    }
  }

  let visited = new Set();
  let stack = [startNode];
  let neighbors = [
    [2, 0],
    [-2, 0],
    [0, 2],
    [0, -2]
  ];
  while (stack.length > 0) {
    let cur = stack.pop();
    let r = cur[0],
      c = cur[1];
    console.log(r, c);
    visited.add(r + "." + c);
    grid[r][c].isWall = false;
    for (let n of neighbors) {
      let rr = r + n[0];
      let cc = c + n[1];
      if (isValid(rr, cc, grid) && !visited.has(rr + "." + cc)) {
        grid[r + n[0] / 2][c + n[0] / 2].isWall = false;
        stack.push([rr, cc]);
        break;
      }
    }
  }
  return grid;
}
JavaScript
函数有效(r、c、网格){
if(r<0 | | c<0){
返回false;
}
if(r0){
设cur=stack.pop();
设r=cur[0],
c=cur[1];
控制台日志(r,c);
添加(r+“+c);
网格[r][c].isWall=false;
对于(让n个邻居){
设rr=r+n[0];
设cc=c+n[1];
if(isValid(rr,cc,grid)&&!visitored.has(rr+“+cc)){
网格[r+n[0]/2][c+n[0]/2].isWall=false;
堆栈推送([rr,cc]);
打破
}
}
}
返回网格;
}

我真的很想得到一些关于我的代码哪里出错的指导。谢谢大家!

我相信这个错误可能是因为你的线路

grid[r + n[0] / 2][c + n[0] / 2].isWall = false;
我认为有一个打字错误,你想要的是

grid[r + n[0] / 2][c + n[1] / 2].isWall = false; //simply change n[0] to n[1]
现在在if条件下还有另一个逻辑错误:

for (let n of neighbors) {
  let rr = r + n[0];
  let cc = c + n[1];
  if (isValid(rr, cc, grid) && !visited.has(rr + "." + cc)) {
    grid[r + n[0] / 2][c + n[0] / 2].isWall = false;
    stack.push([rr, cc]);
    break;
  }
}
递归回溯算法需要选择一个随机的可用邻居,您所做的只是选择您找到的第一个可用邻居。 如您所见,if条件检查单元格是否可用,然后在单元格可用时立即执行操作

我试着运行代码,它只是变成了一条垂直的线条。 因此,请尝试将可用坐标存储在列表中,并从新列表中随机选取一个坐标。这似乎修复了错误:)