老鼠迷宫问题

381 阅读2分钟

说明

假说我们有一个大小为n*n的矩阵,矩阵的每一个位置是一个方块。每个位置可以是空闲的(值为1)或是被阻挡的(值为0),如下图所示,其中s是起点,d是终点 image.png 矩阵是迷宫,‘老鼠’的目标是从位置[0][0]开始并移动到[n-1][n-1](终点),‘老鼠’可以在水平或垂直方向上任何未被阻挡的位置间移动

例子

使用下面代码进行测试

const maze = [
    [1,0,0,0],
    [1,1,1,1],
    [1,0,1,0],
    [1,0,1,1],
  ]

思路

  1. 首先创建一个大小一样的矩阵,将每一个位置初始化为0
  2. 对于老鼠的每一步行动我们将路劲标记为1
  3. 使用递归来判断x+1,或者y+1的节点是否满足条件,不满足条件则从新把路劲标为0

代码

function ratInAAmaze(maze) {
  // 初始化矩阵每一项为0
  let r = [];
  for (let i = 0; i < maze.length; i++) {
    r[i] = [];
    for (let j = 0; j < maze[i].length; j++) {
      r[i][j] = 0;
    }
  }
  // 递归寻找下一个路径坐标点,如果找到正确到达[n-1][n-1]的路径则使用结果r
  if (findPath(maze, 0, 0, r)) {
    return r;
  }
  return "NO PATH";
}
function findPath(maze, x, y, r) {
  const n = maze.length;
  // 如果寻找到最后一个位置,即[n-1][n-1],则找到正确路径,返回true
  if (x === n - 1 && y === n - 1) {
    r[x][y] = 1;
    return true
  }
  // 判断当前坐标点是否可用
  if (isSafe(maze, x, y)) {
    // 可用则设置坐标点的值为1
    r[x][y] = 1;
    //  递归寻找下一个路径坐标点(x+1)
    if (findPath(maze, x + 1, y, r)) {
      return true;
    }
    // 递归寻找下一个路径坐标点(y+1)
    if (findPath(maze, x, y + 1, r)) {
      return true;
    }
    // 如果下一个路径坐标点不可用,则当前坐标点也不可用
    r[x][y] = 0;
    return false;
  }
  return false;
}
function isSafe(maze, x, y) {
  const n = maze.length;
  if (x < n && y < n && maze[x][y] !== 0) {
    return true;
  }
  return false;
}
const maze = [
  [1,0,0,0],
  [1,1,1,1],
  [0,0,1,0],
  [1,1,1,0],
]
console.log(ratInAAmaze(maze))