From e9fd4a93e43bbe391694087f28a63af249ec9f80 Mon Sep 17 00:00:00 2001
From: hasan <hasanuli10@gmail.com>
Date: Sun, 6 Jun 2021 11:11:08 +0600
Subject: [PATCH] Fixes #620

---
 Backtracking/NQueen.js            | 40 +++++++++++++++----------------
 Backtracking/tests/NQueen.test.js | 15 ++++++++++++
 2 files changed, 34 insertions(+), 21 deletions(-)
 create mode 100644 Backtracking/tests/NQueen.test.js

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)
+  })
+})