The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'
and '.'
both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
题目原意:
n皇后问题:将n个皇后放置于n x n的棋盘上,要求每两个皇后之间不要攻击彼此。
给出数字n,求所有n皇后问题中独立解的集合。
每一个解包含棋盘上n皇后的唯一位置摆放,‘Q'和’.'分别表示皇后和空位置。
解题思路:
一行一行地放置Queen,如果当前位置为有效解,则继续下一行;若当前位置无效,backtracking至上一层,重新调整。
需要注意的是,已经摆放好的Queen我们用一个数组visited来记录。
visited[i] = j 表示,前0 ~ irow-1行中,board i行第j列,摆放着Queen。
检测当前棋盘valid的方法是:(irow表示当前尝试放入Queen所在行的脚标)
新放入的列 i 不能与已有的visited[0 ~ irow-1]的值一致, 即不能同一列;
新放入的行与[0 ~ irow-1]的差 !== Math.abs(新放入的列 i 与皇后所在位置的列的差),即顺向&反向对角线不能同一列。
效率计算:
时间复杂度:O(n^2)
空间复杂度:O(n)
代码如下:
/** * @param {number} n * @return {string[][]} */ var solveNQueens = function (n) { var ret = []; if (n === 0) { return ret; } solveNQueensBuilder(n, ret, [], [], 0); return ret; }; function solveNQueensBuilder(n, ret, item, visited, irow) { if (irow === n) { ret.push(item.slice()); return; } for (var i = 0; i < n; i++) { if (validQueen(visited, irow, i)) { var temp = new Array(n); temp.fill('.'); temp[i] = 'Q'; item.push(temp.join('')); visited.push(i); solveNQueensBuilder(n, ret, item, visited, irow + 1); visited.pop(); item.pop(); } } } function validQueen(visited, irow, i) { for (j = 0; j < visited.length; j++) { if (visited[j] === i || (irow - j) === Math.abs(i - visited[j])) { return false; } } return true; }