diff --git a/Backtracking/NQueen.js b/Backtracking/NQueen.js index dfd3dfa9fb..d76f232125 100644 --- a/Backtracking/NQueen.js +++ b/Backtracking/NQueen.js @@ -2,6 +2,7 @@ class NQueen { constructor (size) { this.board = new Array(size).fill('.').map(() => new Array(size).fill('.')) this.size = size + this.solutionCount = 0 } isValid ([row, col]) { @@ -25,18 +26,26 @@ class NQueen { return true } + placeQueen (row, col) { + this.board[row][col] = 'Q' + } + + removeQueen (row, col) { + this.board[row][col] = '.' + } + solve (col = 0) { - // function to solve the board - if (col >= this.size) { return true } + if (col >= this.size) { + this.printBoard() + this.solutionCount++ + 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] = '.' + this.placeQueen(i, col) + this.solve(col + 1) + this.removeQueen(i, col) } } @@ -44,22 +53,11 @@ class NQueen { } printBoard () { - // utility function to display the board + console.log('\n') 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() +export { NQueen } diff --git a/Backtracking/tests/NQueen.test.js b/Backtracking/tests/NQueen.test.js new file mode 100644 index 0000000000..50000d1be1 --- /dev/null +++ b/Backtracking/tests/NQueen.test.js @@ -0,0 +1,15 @@ +import { NQueen } from '../NQueen' + +describe('NQueen', () => { + it('should return 2 solutions for 4x4 size board', () => { + const _4Queen = new NQueen(4) + _4Queen.solve() + expect(_4Queen.solutionCount).toEqual(2) + }) + + it('should return 92 solutions for 8x8 size board', () => { + const _8Queen = new NQueen(8) + _8Queen.solve() + expect(_8Queen.solutionCount).toEqual(92) + }) +})