From e0d1fdf833c382a0d13e40285f96acad6d7d460d Mon Sep 17 00:00:00 2001 From: Ignacio Chiazzo Date: Sat, 27 Oct 2018 13:03:20 -0400 Subject: [PATCH] Added n queens problem --- Main.js | 4 ++- NQueens.js | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 NQueens.js diff --git a/Main.js b/Main.js index b9011fd..50f9633 100644 --- a/Main.js +++ b/Main.js @@ -2,9 +2,11 @@ var permutationWithoutDuplicates = require("./PermutationsWithoutDuplicates.js"); var permutationWithDuplicates = require("./PermutationsWithDuplicates.js"); var subsets = require("./Subsets.js"); +var nQueens = require("./NQueens.js"); // Invocation // permutationWithoutDuplicates.main(); // permutationWithDuplicates.main(); -// subsets.main(); \ No newline at end of file +// subsets.main(); +// nQueens.main(); diff --git a/NQueens.js b/NQueens.js new file mode 100644 index 0000000..e94c906 --- /dev/null +++ b/NQueens.js @@ -0,0 +1,92 @@ +/* https://leetcode.com/problems/n-queens/description/ + +Example: + +Input: 4 +Output: [ + [".Q..", // Solution 1 + "...Q", + "Q...", + "..Q."], + + ["..Q.", // Solution 2 + "Q...", + "...Q", + ".Q.."] +] +Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above. +*/ + +/** + * @param {number} n + * @return {string[][]} + */ +var solveNQueens = function(n) { + var sol = []; + solveNQueensAux(n, 0, new Set(), new Set(), new Set(), [], sol); + return parseSolutions(sol, n); +}; + +var solveNQueensAux = function(n, row, diagonalDiffs, diagonalSums, cols, currentSol, sol) { + if(row == n) { + sol.push(currentSol); + return; + } + + for(var i = 0; i < n; i++) { + const diagonalDiff = i - row; + const diagonalSum = i + row; + if(!diagonalDiffs.has(diagonalDiff) && !cols.has(i) && !diagonalSums.has(diagonalSum)) { + diagonalDiffs.add(diagonalDiff); + diagonalSums.add(diagonalSum); + cols.add(i); + solveNQueensAux(n, row + 1, diagonalDiffs, diagonalSums, cols, [...currentSol, ...[[row, i]]], sol); + cols.delete(i); + diagonalDiffs.delete(diagonalDiff); + diagonalSums.delete(diagonalSum); + } + } + return; +} + +var parseSolutions = function(sols, n) { + var matrixes = []; + for(var i = 0; i < sols.length; i++) { + var sol = sols[i]; + var matrix = []; + for(var row = 0; row < n; row++) { + matrix[row] = [] + const queenPos = sol[row]; + for(var col = 0; col < n; col++) { + matrix[row] += (queenPos[1] == col) ? "Q" : "."; + } + } + + matrixes.push(matrix); + } + + return matrixes; +} + +var printMatrixes = function(matrixes, n) { + console.log("Start solution of n: " + n); + for(var i = 0; i < matrixes.length; i++) { + printMatrix(matrixes[i]); + } + console.log("End solution of n: " + n); +} + +var printMatrix = function(matrix) { + console.log("------------"); + for(var i = 0; i < matrix.length; i++) { + console.log(matrix[i]); + } + console.log("------------"); +} + +var main = function(n) { + printMatrixes(solveNQueens(4), 4); + printMatrixes(solveNQueens(5), 5); + printMatrixes(solveNQueens(6), 6); +} +main(); \ No newline at end of file