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([]);
}