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;
}

查看38道真题和解析