华为机试 43 题, 迷宫问题 。思路:深度优先搜索

const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});
const ipt = [];
rl.on("line", function (line) {
    ipt.push(line.split(' ').map(e => Number(e)));
}).on('close', function () {
    fun43(ipt);
});
function fun43(ipt) {
    let first = ipt.shift(), m = first[0], n = first[1], res = [], minSteps = Number.MAX_VALUE; // 初始化一些变量,minSteps代表目前为止的最小步数
    let visited = new Array(m).fill().map(() => new Array(n).fill(false));
    const dfs = (i, j, curRes) => {
        if (i < 0 || i >= m || j < 0 || j >= n || ipt[i][j] === 1 || visited[i][j]) return; // 如果索引值超出数组范围或者遇到墙壁或者当前位置已被访问过,则返回
        if (i === m - 1 && j === n - 1) {  // 如果当前位置是终点
            curRes.push(`(${i},${j})`);  // 那么将终点坐标 push 进当前结果 
            if (curRes.length < minSteps) {  // 如果当前结果步数小于目前为止的最小步数 minSteps,那就更新最终答案和 minSteps
                minSteps = curRes.length;
                res = [...curRes];
            }
            return;   // 返回
        }
        // 如果当前位置不是终点,那就把当前坐标 push 进入 curRes,并把当前位置设置为“访问过”,而后向上下左右四个方向递归
        // 最后一定要记得递归结束后要 pop 出当前坐标,并把当前位置设置为“未访问过”
        curRes.push(`(${i},${j})`);
        visited[i][j] = true;
        dfs(i + 1, j, curRes);
        dfs(i - 1, j, curRes);
        dfs(i, j + 1, curRes);
        dfs(i, j - 1, curRes);
        curRes.pop();
        visited[i][j] = false;
    };
    dfs(0, 0, []);   // 开始递归
    for (const e of res) {   // 输出结果
        console.log(e);
    }
}