File tree Expand file tree Collapse file tree
src/algorithms/uncategorized/n-queens-bitwise Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ # N-Queens Problem with Bitwise Solution
2+
3+ Write a function that will find all possible solutions to the N queens problem for a given N.
4+
5+ ## References
6+
7+ - [ Wikipedia] ( https://en.wikipedia.org/wiki/Eight_queens_puzzle )
8+ - [ GREG TROWBRIDGE] ( http://gregtrowbridge.com/a-bitwise-solution-to-the-n-queens-problem-in-javascript/ )
9+ - [ Backtracking Algorithms in MCPL using Bit Patterns and Recursion] ( http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.51.7113&rep=rep1&type=pdf )
Original file line number Diff line number Diff line change 1+ import nQueensBitwise from '../nQueensBitwise' ;
2+
3+ describe ( 'nQueensBitwise' , ( ) => {
4+ it ( 'should have solutions for 4 to N queens' , ( ) => {
5+ const solutionFor4 = nQueensBitwise ( 4 ) ;
6+ expect ( solutionFor4 ) . toBe ( 2 ) ;
7+
8+ const solutionFor5 = nQueensBitwise ( 5 ) ;
9+ expect ( solutionFor5 ) . toBe ( 10 ) ;
10+
11+ const solutionFor6 = nQueensBitwise ( 6 ) ;
12+ expect ( solutionFor6 ) . toBe ( 4 ) ;
13+
14+ const solutionFor7 = nQueensBitwise ( 7 ) ;
15+ expect ( solutionFor7 ) . toBe ( 40 ) ;
16+
17+ const solutionFor8 = nQueensBitwise ( 8 ) ;
18+ expect ( solutionFor8 ) . toBe ( 92 ) ;
19+
20+ const solutionFor9 = nQueensBitwise ( 9 ) ;
21+ expect ( solutionFor9 ) . toBe ( 352 ) ;
22+
23+ const solutionFor10 = nQueensBitwise ( 10 ) ;
24+ expect ( solutionFor10 ) . toBe ( 724 ) ;
25+ } ) ;
26+ } ) ;
Original file line number Diff line number Diff line change 1+ export default function ( n ) {
2+ // Keeps track of the # of valid solutions
3+ let count = 0 ;
4+
5+ // Helps identify valid solutions
6+ const done = ( 2 ** n ) - 1 ;
7+
8+ // Checks all possible board configurations
9+ const innerRecurse = ( ld , col , rd ) => {
10+ // All columns are occupied,
11+ // so the solution must be complete
12+ if ( col === done ) {
13+ count += 1 ;
14+ return ;
15+ }
16+
17+ // Gets a bit sequence with "1"s
18+ // whereever there is an open "slot"
19+ let poss = ~ ( ld | rd | col ) ;
20+
21+ // Loops as long as there is a valid
22+ // place to put another queen.
23+ while ( poss & done ) {
24+ const bit = poss & - poss ;
25+ poss -= bit ;
26+ innerRecurse ( ( ld | bit ) >> 1 , col | bit , ( rd | bit ) << 1 ) ;
27+ }
28+ } ;
29+
30+ innerRecurse ( 0 , 0 , 0 ) ;
31+
32+ return count ;
33+ }
You can’t perform that action at this time.
0 commit comments