Skip to content

Commit 1c9f70a

Browse files
author
Komal Dua
committed
Backtracking Category & N Queens Problem
1 parent e2b4c84 commit 1c9f70a

File tree

4 files changed

+94
-0
lines changed

4 files changed

+94
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"N Queens Problem": "The N Queen is the problem of placing N chess queens on an N×N chessboard so that no two queens attack each other.",
3+
"Applications": [
4+
"Puzzle Solving",
5+
"Searching"
6+
],
7+
"Complexity": {
8+
"time": "Worst O(N!)",
9+
"space": "Worst O(N)"
10+
},
11+
"References": [
12+
"<a href='http://www.geeksforgeeks.org/backtracking-set-3-n-queen-problem/'>geeksforgeeks</a>"
13+
],
14+
"files": {
15+
"n_queens": "Solving the N Queens Puzzle using Backtracking & Recursion"
16+
}
17+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
function validState (row, col, currentQueen) {
2+
for (var q = 0; q < currentQueen; q++) {
3+
var currentQ = queens [q];
4+
if ( row === currentQ [0] || col === currentQ [1] || ( Math.abs(currentQ [0] - row) === Math.abs(currentQ [1] - col)) ) {
5+
return false;
6+
}
7+
}
8+
return true;
9+
}
10+
11+
function nQ (currentQueen, currentCol) {
12+
logger._print ('Starting new iteration of nQueens () with currentQueen = ' + currentQueen + ' & currentCol = ' + currentCol);
13+
logger._print ('------------------------------------------------------------------');
14+
if (currentQueen >= N) {
15+
logger._print ('The recursion has BOTTOMED OUT. All queens have been placed successfully');
16+
return true;
17+
}
18+
19+
var found = false, row = 0;
20+
while ( (row < N) && (!found) ) {
21+
boardTracer._select (row, currentCol)._wait ();
22+
logger._print ('Trying queen ' + currentQueen + ' at row ' + row + ' & col ' + currentCol);
23+
24+
if (validState (row, currentCol, currentQueen)) {
25+
queens [currentQueen] [0] = row;
26+
queens [currentQueen] [1] = currentCol;
27+
28+
queenTracer._notify (currentQueen, 0, row)._wait ();
29+
queenTracer._notify (currentQueen, 1, currentCol)._wait ();
30+
queenTracer._denotify (currentQueen, 0)._wait ();
31+
queenTracer._denotify (currentQueen, 1)._wait ();
32+
33+
found = nQ (currentQueen + 1, currentCol + 1);
34+
}
35+
36+
if (!found) {
37+
boardTracer._deselect (row, currentCol)._wait ();
38+
logger._print ('row ' + row + ' & col ' + currentCol + ' didn\'t work out. Going down');
39+
}
40+
row++;
41+
}
42+
43+
return found;
44+
}
45+
46+
logger._print ('Starting execution');
47+
nQ (0, 0);
48+
logger._print ('DONE');
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var N = 4; //just change the value of N and the visuals will reflect the configuration!
2+
var board = (function createArray (N) {
3+
var result = [];
4+
for (var i = 0; i < N; i++) {
5+
result [i] = Array.apply(null, Array(N)).map(Number.prototype.valueOf,0);
6+
}
7+
return result;
8+
}) (N);
9+
var queens = (function qSetup (N) {
10+
var result = [];
11+
for (var i = 0; i < N; i++) {
12+
result [i] = [-1,-1];
13+
}
14+
return result;
15+
}) (N);
16+
17+
var boardTracer = new Array2DTracer ('Board'),
18+
queenTracer = new Array2DTracer ('Queen Positions'),
19+
logger = new LogTracer ('Progress');
20+
21+
boardTracer._setData (board);
22+
queenTracer._setData (queens);
23+
logger._print ('N Queens: ' + N + 'X' + N + 'matrix, ' + N + ' queens');

algorithm/category.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
{
2+
"backtracking": {
3+
"list": {
4+
"n_queens": "N Queens Problem"
5+
},
6+
"name": "Backtracking"
7+
},
28
"cryptography": {
39
"list": {
410
"affine_cipher": "Affine Cipher",

0 commit comments

Comments
 (0)