题目
输入一个n(数字),代表把n个皇后放在n*n的棋盘上,使其各个皇后行,列,斜线都不能碰撞,输出多少种方法(著名的八皇后)
栗子如下:
输入: 4
输出:2
案例如下:
/**
* @param {number} n
* @param {number} rows
* @param {Object} columns
* @param {Object} lefttopTorightBottom
* @param {Object} leftbottomTorightTop
* @return {number}
*/
function getRowNums(n, rows, columns, lefttopTorightBottom, leftbottomTorightTop){
if(n == rows){
return 1;
}else{
let re = 0;
for(let column = 0; column < n; column++){
// 列
if(columns[column]){
continue;
}
// 左上角到右下角的斜线
let lefttopTorightBottomIndex = rows - column;
if(lefttopTorightBottom[lefttopTorightBottomIndex]){
continue;
}
// 左下角到右上角的斜线
let leftbottomTorightTopIndex = rows + column;
if(leftbottomTorightTop[leftbottomTorightTopIndex]){
continue;
}
columns[column] = true;
lefttopTorightBottom[lefttopTorightBottomIndex] = true;
leftbottomTorightTop[leftbottomTorightTopIndex] = true;
re += getRowNums(n, rows + 1, columns,lefttopTorightBottom,leftbottomTorightTop);
// 回溯
columns[column] = false;
lefttopTorightBottom[lefttopTorightBottomIndex] = false;
leftbottomTorightTop[leftbottomTorightTopIndex] = false;
}
return re;
}
}
/**
* @param {number} n
* @return {number}
*/
var totalNQueens = function(n) {
let columns = {} , lefttopTorightBottom = {}, leftbottomTorightTop = {};
return getRowNums(n,0,columns,lefttopTorightBottom,leftbottomTorightTop)
};