Skip to content

Instantly share code, notes, and snippets.

@bellbind
Last active January 31, 2019 12:25
Show Gist options
  • Save bellbind/ee56121c7036b109247a to your computer and use it in GitHub Desktop.
Save bellbind/ee56121c7036b109247a to your computer and use it in GitHub Desktop.
[javascript]n-queens in evolutional way
// queens: column numbers of queen in each row : 0-7
var isValid = function (queens) {
return queens.every(function (cur, index) {
for (var i = index + 1; i < queens.length; i++) {
if (cur === queens[i]) return false; // as same column
if (cur + index === queens[i] + i) return false; // as 07=16=25=...
if (cur - index === queens[i] - i) return false; // as 00=11=22=...
}
return true;
})
};
//[S1] iterating solution
var nQueens1 = function (n) {
var init = function (n) {
return Array.apply(null, Array(n)).map(function () {return 0;});
};
var next = function (queens) {
for (var i = 0; i < queens.length; i++) {
if (queens[i] + 1 !== queens.length) {
queens[i] += 1;
return true;
} else {
queens[i] = 0; //carry up
}
}
return queens[queens.length - 1] !== 0; // false when overflow
};
// main
var queens = init(n);
var c = 0;
do {
if (isValid(queens)) {
//console.log(queens);
c++;
}
} while (next(queens));
return c;
};
console.log("[S1]", nQueens1(8)); // 92
//[S2] backtracking solution
var nQueens2 = function (n) {
var c = 0;
var queens = [];
(function solve() {
if (queens.length === n) {
if (isValid(queens)) {
//console.log(queens);
c++;
}
return;
}
for (var i = 0; i < n; i++) {
queens.push(i);
solve();
queens.pop();
}
})();
return c;
};
console.log("[S2]", nQueens2(8)); // 92
//[S3] backtracking solution2: high perfoemance
var nQueens3 = function (n) {
var c = 0;
var queens = [];
(function solve() {
if (queens.length === n) {
//console.log(queens);
c++;
return;
}
for (var i = 0; i < n; i++) {
queens.push(i);
if (isValid(queens)) solve();
queens.pop();
}
})();
return c;
};
console.log("[S3]", nQueens3(8)); // 92
//[S4] immutable list solution
var nQueens4 = function (n) {
var c = 0;
(function solve(queens) {
if (queens.length === n) {
//console.log(queens);
c++;
return;
}
for (var i = 0; i < n; i++) {
var nextqueens = queens.concat([i]);
if (isValid(nextqueens)) solve(nextqueens);
}
})([]);
return c;
};
console.log("[S4]", nQueens4(8)); // 92
//[S5] functional way: everything immutable
var nQueens5 = function (n) {
// list helpers
var range = function (n) {
return Array.apply(null, Array(n)).map(function (e, i) {return i;});
};
return (function solve(queens) {
if (queens.length === n) {
//console.log(queens);
return 1;
}
return range(n).map(function (i) {
return queens.concat([i]);
}).filter(isValid).map(solve).reduce(function (total, c) {
return total + c;
}, 0);
})([]);
};
console.log("[S5]", nQueens5(8)); // 92
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment