From 40f91ece25fa477eb8869a2218a19f48d5c97705 Mon Sep 17 00:00:00 2001 From: Tapajyoti Bose <44058757+ruppysuppy@users.noreply.github.com> Date: Fri, 26 Jun 2020 21:02:40 +0530 Subject: [PATCH] Added n-queen (#206) --- back-tracking/NQueen.js | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 back-tracking/NQueen.js diff --git a/back-tracking/NQueen.js b/back-tracking/NQueen.js new file mode 100644 index 000000000..dfd3dfa9f --- /dev/null +++ b/back-tracking/NQueen.js @@ -0,0 +1,65 @@ +class NQueen { + constructor (size) { + this.board = new Array(size).fill('.').map(() => new Array(size).fill('.')) + this.size = size + } + + isValid ([row, col]) { + // function to check if the placement of the queen in the given location is valid + + // checking the left of the current row + for (let i = 0; i < col; i++) { + if (this.board[row][i] === 'Q') return false + } + + // checking the upper left diagonal + for (let i = row, j = col; i >= 0 && j >= 0; i--, j--) { + if (this.board[i][j] === 'Q') return false + } + + // checking the lower left diagonal + for (let i = row, j = col; j >= 0 && i < this.size; i++, j--) { + if (this.board[i][j] === 'Q') return false + } + + return true + } + + solve (col = 0) { + // function to solve the board + if (col >= this.size) { return true } + + for (let i = 0; i < this.size; i++) { + if (this.isValid([i, col])) { + this.board[i][col] = 'Q' + + if (this.solve(col + 1)) { return true } + + // backtracking + this.board[i][col] = '.' + } + } + + return false + } + + printBoard () { + // utility function to display the board + for (const row of this.board) { + console.log(...row) + } + } +} + +function main () { + const board = new NQueen(8) + + board.printBoard() + console.log('\n') + + board.solve() + + board.printBoard() +} + +main()