美文网首页
labuladong的算法小抄之js实现-第0章-回溯算法

labuladong的算法小抄之js实现-第0章-回溯算法

作者: flutter开发精选 | 来源:发表于2021-01-05 17:49 被阅读0次

    文章直达地址: https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie/hui-su-suan-fa-xiang-jie-xiu-ding-ban

    本系列为labuladong的算法小抄的javascript实现版本,实现原理参考labuladong的算法小抄。本文为第0章第3小节《回溯算法》所涉及的代码,直接上代码:

    // //全排列
    // const result = [];
    
    /**
     * @param {number[]} nums
     * @return {number[][]}
     */
    var permute = function (nums) {
      const result = [];
      const tracks = [];
      backtrack(nums, tracks);
      function backtrack(nums, tracks) {
        if (tracks.length == nums.length) {
          result.push(Array.from(tracks));
          return;
        }
        for (let i = 0; i < nums.length; i++) {
          if (tracks.indexOf(nums[i]) >= 0) continue;
          tracks.push(nums[i]);
          backtrack(nums, tracks);
          tracks.pop();
        }
      }
    
      return result;
    };
    
    // permute([1, 2, 3]);
    // console.log(result);
    
    // n皇后问题
    /**
     * @param {number} n
     * @return {string[][]}
     */
    var solveNQueens = function (n) {
      var result = [];
      var chessboard = new Array(n);
      chessboard.fill(new Array(n + 1).join("."));
    
      backtrack(chessboard, 0);
    
      function replaceStr1(str, index, char) {
        const strAry = str.split("");
        strAry[index] = char;
        return strAry.join("");
      }
      function backtrack(chessboard, row) {
        if (row === n) {
          result.push(JSON.parse(JSON.stringify(chessboard)));
          return;
        }
        for (let col = 0; col < n; col++) {
          if (!isValid(chessboard, row, col)) {
            continue;
          }
          chessboard[row] = replaceStr1(chessboard[row], col, "Q");
          backtrack(chessboard, row + 1);
          chessboard[row] = replaceStr1(chessboard[row], col, ".");
        }
      }
      function isValid(chessboard, row, col) {
        // col测试
        for (let i = 0; i < row; i++) {
          if (chessboard[i][col] == "Q") return false;
        }
    
        // 左上角
        for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
          if (chessboard[i][j] == "Q") return false;
        }
    
        // 右上角
        for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
          if (chessboard[i][j] == "Q") return false;
        }
        return true;
      }
      return result;
    };
    
    solveNQueens(4);
    

    相关文章

      网友评论

          本文标题:labuladong的算法小抄之js实现-第0章-回溯算法

          本文链接:https://www.haomeiwen.com/subject/jnywoktx.html