SOURCE

let results = [];

function valid(board, row, col) {
    for(let iRow = 0; iRow < board.length; iRow++){
        if(board[iRow][col] == "Q") {
            return false
        }
    }
    for (let m = row-1, n = col-1; m >= 0 && n >= 0; m--, n--) {
        if(board[m][n] == "Q") {
            return false
        }
    }
    for (let x = row-1, y = col+1; x >= 0 && y < board.length; x--, y++) {
        if(board[x][y] == "Q") {
            return false
        }
    }
    return true
};

function backTrace (board, row) {
    if(board.length < row+1) {
        let solutionBoard = new Array(board.length);
        for(let index in board) {
            // console.log(board[index])
            solutionBoard[index] = board[index].slice(0);
        }
        // console.log("\n\n\n")
        results.push(solutionBoard)
        return
    }
    for(let col = 0; col < board.length; col++) {
        if(valid(board, row, col)) {
            board[row][col] = "Q"
            backTrace(board, row+1)
            board[row][col] = "+"
        }
    }
};

function queens(N) {
    let board = new Array(N)
    for(let i = 0; i < N; i ++){
        board[i] = new Array(N)
        for(let j = 0; j < N; j ++){
            board[i][j] = "+"
        }
    }
    backTrace(board, 0)
    return results
};

function printSolutions(solutions) {
    for(let solu in solutions) {
        let board = solutions[solu];
        for(let index in board) {
            console.log(board[index])
        }
        console.log("\n a solution")
    }
    console.log("\n")
    console.log(results.length + " solutions in total")
}

queens(8);

printSolutions(results)



// =================================================

// let results = [];

// function valid(board, row, col) {
//     for(let iRow = 0; iRow < board.length; iRow++){
//         if(board[iRow][col] == "Q") {
//             return false
//         }
//     }
//     for (let m = row-1, n = col-1; m >= 0 && n >= 0; m--, n--) {
//         if(board[m][n] == "Q") {
//             return false
//         }
//     }
//     for (let x = row-1, y = col+1; x >= 0 && y < board.length; x--, y++) {
//         if(board[x][y] == "Q") {
//             return false
//         }
//     }
//     return true
// };

// function backTrace (board, row) {
//     if(board.length < row+1) {
//         let solutionBoard = new Array(board.length);
//         for(let index in board) {
//             // console.log(board[index])
//             solutionBoard[index] = board[index].slice(0);
//         }
//         // console.log("\n\n\n")
//         results.push(solutionBoard)
//         return true
//     }
//     for(let col = 0; col < board.length; col++) {
//         if(valid(board, row, col)) {
//             board[row][col] = "Q"
//             if(backTrace(board, row+1)) {
//                 return true;
//             } 
//             board[row][col] = "+"
//         }
//     }
//     return false
// };

// function queens(N) {
//     console.log(N + " queens")
//     let board = new Array(N)
//     for(let i = 0; i < N; i ++){
//         board[i] = new Array(N)
//         for(let j = 0; j < N; j ++){
//             board[i][j] = "+"
//         }
//     }
//     if(!backTrace(board, 0)) {
//         console.log("No solution!")
//     }
//     return results
// };

// function printSolutions(solutions) {
//     for(let solu in solutions) {
//         let board = solutions[solu];
//         for(let index in board) {
//             console.log(board[index])
//         }
//         console.log("\n a solution")
//     }
//     console.log("\n")
//     // console.log(results.length + " solutions in total")
// }

// queens(3);

// printSolutions(results)
console 命令行工具 X clear

                    
>
console