mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-06 01:18:23 +08:00

* 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>
68 lines
1.4 KiB
JavaScript
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 }
|