每天一道题,赛过活神仙—— 八皇后

285 阅读1分钟

题目

输入一个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)
};