JavaScript题解 | #迷宫问题#

迷宫问题

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

const rl = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

const inputs = [];
const dr = [{x: -1, y: 0}, { x: 0, y: 1 }, { x: 1, y: 0 }, {x: 0, y: -1}];

rl.on('line', (line) => {
    inputs.push(line);
}).on('close', () => {
    // 1. 初始化迷宫
    const maze = initMaza(inputs);
    // 2. dfs
    dfs(maze, 0, 0);
});

// 题目要求是左上角到右下角,所以起点和终点是固定
function dfs(maze, i, j, visited = ['(0,0)']) {
    const row = maze.length, col = maze[0].length;

    // 终止条件
    if(i == row - 1 && j == col -1) {
        // 输出路径
        visited.forEach(item => {
            console.log(item);
        })
        return;
    }
    // // up
    // if(i-1 >= 0 && maze[i-1][j] == 0 && !visited.includes(`(${i-1},${j})`)) {
    //     visited.push(`(${i-1},${j})`);
    //     dfs(maze, i-1, j, visited);
    //     visited.pop();
    // }
    // // right
    // if(j+1 < col && maze[i][j+1] == 0 && !visited.includes(`(${i},${j+1})`)) {
    //     visited.push(`(${i},${j+1})`);
    //     dfs(maze, i, j+1, visited);
    //     visited.pop();
    // }
    // // down
    // if(i+1 < row && maze[i+1][j] == 0 && !visited.includes(`(${i+1},${j})`)) {
    //     visited.push(`(${i+1},${j})`);
    //     dfs(maze, i+1, j, visited);
    //     visited.pop();
    // }
    // // left
    // if(j-1 >= 0 && maze[i][j-1] == 0 && !visited.includes(`(${i},${j-1})`)) {
    //     visited.push(`(${i},${j-1})`);
    //     dfs(maze, i, j-1, visited);
    //     visited.pop();
    // }
    // 简化上面四个方向的代码
    for(let k = 0; k < 4; k++) {
        const x = i + dr[k].x, y = j + dr[k].y;
        if(x >= 0 && x < row && y >= 0 && y < col &&
            maze[x][y] == 0 &&
            !visited.includes(`(${x},${y})`)
        ) {
            visited.push(`(${x},${y})`);
            dfs(maze, x, y, visited);
            visited.pop();
        }
    }
    return;
}

function initMaza(inputs) {
    const rAc = inputs[0].split(' ');
    row = rAc[0];
    col = rAc[1];
    const maze = [];

    for(let i = 1; i <= row; i++) {
        maze.push(inputs[i].split(' '));
    }

    return maze;
}

难度:⭐⭐⭐

思路:

DFS 本质其实还是枚举,枚举所有的可能性。这道题,从(0,0)点出发,朝四个方向一步一步的试探,如果最后试探到了终点就打印这次试探中的路径。

DFS模板:

DFS(...可能需要的参数) {
	if(终止条件) {
	  // 可能需要做些其它,比如打印记录
		return; // 是否有返回也根据实际情况来,一般返回Boolean类型,一层一层往上回溯传递条件
	}
  for(....) {
  	// 进行操作,比如
	visited.push(i, i);
	// 递归
	DFS(...) 
	// 回溯
	visited.pop()
  }
  
  return;
}
全部评论

相关推荐

11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务