Skip to content

Latest commit

 

History

History
86 lines (74 loc) · 2.06 KB

File metadata and controls

86 lines (74 loc) · 2.06 KB
//深度优先搜索DFS

//生成二维数组
function gen2dArray(x, y) {
  const arr = new Array(x).fill(0);
  for (let i = 0; i < x; i++) {
    arr[i] = new Array(y).fill(0);
  }
  return arr;
}

const goalX = 0,
  goalY = 3;
const n = 5,
  m = 5;
const graph = gen2dArray(n, m);
const used = gen2dArray(n, m);

//通过px和py的数组来实现左下右上的移动顺序
const px = [0, 1, 0, -1];
const py = [-1, 0, 1, 0];

let path = 1; //记录路线

function DFS(graph, used, x, y) {
  //当前坐标与目标相同,则成功
  if (x === goalX && y === goalY) {
    console.log('DFS找到目标');
    console.log('路线图:', used);
    return;
  }

  //遍历四个方向
  for (let i = 0; i < 4; i++) {
    const newX = x + px[i];
    const newY = y + py[i];
    if (newX >= 0 && newX < n && newY >= 0 && newY < m && !used[newX][newY]) {
      used[newX][newY] = path++; //将格子设为走过
      DFS(graph, used, newX, newY); //继续下一个格子
    }
  }
}

// 广度优先搜索BFS
function BFS(graph, used, x, y) {
  used[x][y] = path++;
  //当前坐标与目标相同,则成功
  if (x === goalX && y === goalY) {
    console.log('BFS找到目标');
    console.log('路线图:', used);
    return;
  }
  const queue = [];
  queue.push([x, y]); //起点入队
  while (queue.length) {
    const [a, b] = queue.pop();

    //遍历四个方向
    for (let i = 0; i < 4; i++) {
      const newX = a + px[i];
      const newY = b + py[i];
      if (newX >= 0 && newX < n && newY >= 0 && newY < m && !used[newX][newY]) {
        used[newX][newY] = path++; //将格子设为走过

        //当前坐标与目标相同,则成功
        if (newX === goalX && newY === goalY) {
          console.log('找到目标');
          console.log('路线图:', used);
          return;
        } else {
          queue.unshift([newX, newY]); //把该格子入队
        }
      }
    }
  }
  console.log(used);
}

used[0] = [-1, 0, 0, 0, 0]; //设置墙壁,-1的点表示不能走的点
used[1] = [0, 0, 0, 0, 0];

// DFS(graph, used, 0, 4);
BFS(graph, used, 4, 0);