This commit is contained in:
hasan
2021-06-06 11:11:08 +06:00
parent a9b1f8994f
commit e9fd4a93e4
2 changed files with 34 additions and 21 deletions

View File

@ -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 }

View File

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