题解 | #迷宫问题#

迷宫问题

https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  let lines = [];
  while ((line = await readline())) {
    lines.push(line);
  }
  let [n, m] = lines[0].split(" ").map((a) => parseInt(a));
  lines = lines.slice(1, lines.length);
  lines = lines.map((item) => {
    return item.split(" ");
  });
  // 迷宫问题适合用递归
  // 遍历每一条分叉,每一条路线均记录走过的路线,避免出现转圈,死循环
  let result = [];
  fn(0, 0, ["(0,0)"]);
  result[0].forEach((item) => {
    console.log(item);
  });
  function fn(a, b, stepHis) {
  	// 走到终点,分支结束,记录路线到集合
    if (a == n - 1 && b == m - 1) {
      result.push(stepHis);
      return false;
    }
	//  上下左右四条路
    let arry = [
      [a - 1, b],
      [a + 1, b],
      [a, b - 1],
      [a, b + 1],
    ];
    arry.forEach((item) => {
      let [x, y] = item;
      let step = "(" + x + "," + y + ")";
	  // 如果这一步已经走过,此分支结束
      if (stepHis.includes(step)) {
        return false;
      }
	  // 如果横向超越边界,分支结束
      if (x === -1 || x === n) {
        return false;
      }
	  // 纵向超越边界,分支结束
      if (y === m || -1 === y) {
        return false;
      }
	  // 此路撞墙,分支结束
      if (lines[x][y] == 1) {
        return false;
      }
      let his = [...stepHis];
      his.push(step);
	  // 向前走一步,并记录当前路线
      fn(x, y, his);
    });
  }
})();

全部评论

相关推荐

11-11 22:08
佛山大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务