【问题标题】:Printing all solutions in N-Queen Problem打印 N-Queen 问题中的所有解决方案
【发布时间】:2018-09-23 12:30:04
【问题描述】:

N 皇后是在 N×N 棋盘上放置 N 个棋后的问题,这样两个皇后就不会互相攻击。例如,以下是 4 Queen 问题的解决方案。

N 皇后是在 N×N 棋盘上放置 N 个棋后的问题,这样两个皇后就不会互相攻击。

我编写了函数,但它仅打印 1 个解决方案。如何更新此功能以打印所有解决方案?

皇后是“q”,空值是“-”

function find_all_arrangements(n) {
    const allRes = [];

    function isValid(row, col, board) {
  // Checks the ← direction
    for(var i=0; i<col; i++){
      if (board[row][i] === "q") {
        return false;
      }
    }

    // Checks the ↖ direction 
    for(var i=row, j=col; i>=0 && j>=0; i--, j--){
      if (board[i][j] === "q") {
        return false;
      }
    }

    // Checks the ↙ direction 
    for(var i=row, j=col; j>=0 && i<n; i++, j--){
      if (board[i][j] === "q") {
        return false;
      }
    }

    return true;
    }

    function find(col, result) {
        if (col === n) {
            allRes.push(result);
      return true;
        }
        for (let i = 0; i < n; i++) {
            if (isValid(i, col, result)) {
                result[i][col] = "q";
                if (find(col + 1, result)) {
          return true;
        }
        result[i][col] = "-";
            }
        }
    return false;
    }

  function generateBoard(n){
    var board=[];
    for(var i=0; i<n; i++){
      board[i]=[];
      for(var j=0; j<n; j++){
        board[i][j]="-";
      }
    }
    return board;
  }

  var board = generateBoard(n);
  find(0, board);
  return allRes;
}

console.log(find_all_arrangements(4))

【问题讨论】:

    标签: javascript algorithm recursion


    【解决方案1】:

    差不多了,只需修改 find 函数以克隆结果数组并进行一些调整以进行回溯:

    function find(col, result) {
        if (col === n) {
          // this deep clone the 2d array
          allRes.push(JSON.parse(JSON.stringify(result)));
          return;
        }
        for (let i = 0; i < n; i++) {
            if (isValid(i, col, result)) {
                result[i][col] = "q";
                find(col + 1, result)
                result[i][col] = "-";
            }
        }
    }
    

    【讨论】:

    • 谢谢!我尝试使用 arr.slice() 代替 JSON,但似乎它仅适用于一维数组
    猜你喜欢
    • 2019-07-12
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2021-11-10
    相关资源
    最近更新 更多