Public
Edited
Apr 28, 2024
Insert cell
Insert cell
function isDiagonal(r1, c1, r2, c2) {
let dr = r2 - r1;
let dc = c2 - c1;
return dr == dc || dr == -dc;
}
Insert cell
isDiagonal(1,1,3,3)
Insert cell
isDiagonal(0,3,3,0)
Insert cell
function queens(n) {
let res = [];

function place(indexes) {
let m = indexes.length;

if (m == n) {
res.push(indexes);
return;
}

const hasDiagonal = (i) => {
for (let j = 0; j < m; j++) {
if (isDiagonal(m, i, j, indexes[j])) return true
}
return false
}

for (let i = 0; i < n; i++) {
if (indexes.includes(i)) continue;
if (hasDiagonal(i)) continue;
place([...indexes, i]);
}
}

place([]);
return res;
}
Insert cell
queens(2)
Insert cell
queens(3)
Insert cell
queens(4)
Insert cell
queens(5)
Insert cell
queens(6)
Insert cell
queens(7)
Insert cell
queens(8)
Insert cell
function queensN(n) {
function place(indexes) {
let m = indexes.length;

if (m == n) return 1

const hasDiagonal = (i) => {
for (let j = 0; j < m; j++) {
if (isDiagonal(m, i, j, indexes[j])) return true
}
return false
}


let res = 0;
for (let i = 0; i < n; i++) {
if (indexes.includes(i)) continue;
if (hasDiagonal(i)) continue;
res += place([...indexes, i]);
}

return res;
}

return place([]);
}
Insert cell
queensN(12)
Insert cell
queensN(13)
Insert cell
queensN(10)
Insert cell
queensN(11)
Insert cell
function queensM(n) {
const cache = {}
const mirror = (indexes) => indexes.map(i => n - 1 - i);

function place(indexes) {
let m = indexes.length;

if (m == n) return 1

const hasDiagonal = (i) => {
for (let j = 0; j < m; j++) {
if (isDiagonal(m, i, j, indexes[j])) return true
}
return false
}

const key = `${indexes}`
const mirrorKey = `${mirror(indexes)}`
if (key in cache) return cache[key]
if (mirrorKey in cache) return cache[mirrorKey]

let res = 0;
for (let i = 0; i < n; i++) {
if (indexes.includes(i)) continue;
if (hasDiagonal(i)) continue;
res += place([...indexes, i]);
}

cache[key] = res;
cache[mirrorKey] = res;
return res;
}

return place([]);
}
Insert cell
queensM(12)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more