Files
Roland Hummel 86d333ee94 feat: Test running overhaul, switch to Prettier & reformat everything (#1407)
* chore: Switch to Node 20 + Vitest

* chore: migrate to vitest mock functions

* chore: code style (switch to prettier)

* test: re-enable long-running test

Seems the switch to Node 20 and Vitest has vastly improved the code's and / or the test's runtime!

see #1193

* chore: code style

* chore: fix failing tests

* Updated Documentation in README.md

* Update contribution guidelines to state usage of Prettier

* fix: set prettier printWidth back to 80

* chore: apply updated code style automatically

* fix: set prettier line endings to lf again

* chore: apply updated code style automatically

---------

Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
Co-authored-by: Lars Müller <34514239+appgurueu@users.noreply.github.com>
2023-10-04 02:38:19 +05:30

68 lines
1.4 KiB
JavaScript

class NQueens {
constructor(size) {
if (size < 0) {
throw RangeError('Invalid board size')
}
this.board = new Array(size).fill('.').map(() => new Array(size).fill('.'))
this.size = size
this.solutionCount = 0
}
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
}
placeQueen(row, col) {
this.board[row][col] = 'Q'
}
removeQueen(row, col) {
this.board[row][col] = '.'
}
solve(col = 0) {
if (col >= this.size) {
this.solutionCount++
return true
}
for (let i = 0; i < this.size; i++) {
if (this.isValid([i, col])) {
this.placeQueen(i, col)
this.solve(col + 1)
this.removeQueen(i, col)
}
}
return false
}
printBoard(output = (value) => console.log(value)) {
if (!output._isMockFunction) {
output('\n')
}
for (const row of this.board) {
output(row)
}
}
}
export { NQueens }